From d686bddbc3d885789be06d6a7b534bbf294efe10 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 23 Jun 2019 15:20:12 -0400 Subject: [PATCH 001/200] build(book): optimize for different formats --- .circleci/config.yml | 2 +- .gitignore | 15 +- README.md | 101 ++--- book/A-time-complexity-cheatsheet.asc | 39 ++ ... B-self-balancing-binary-search-trees.asc} | 35 +- .../tree-avl.adoc => C-AVL-tree.asc} | 25 +- book/book-all.adoc | 155 -------- book/book-o.adoc | 194 ---------- book/book.adoc | 84 ---- book/ch02-git-basics-chapter.asc | 35 ++ book/chapters/about.adoc | 1 - book/chapters/acknowledgements.adoc | 1 - book/chapters/action.adoc | 4 - book/chapters/appendix.adoc | 3 - book/chapters/avl-tree.adoc | 5 - book/chapters/cheatsheet.adoc | 38 -- book/chapters/dedication.adoc | 5 - book/chapters/divide-and-conquer-intro.adoc | 17 - book/chapters/divide-and-conquer.adoc | 9 - .../dynamic-programming-fibonacci.adoc | 35 -- book/chapters/dynamic-programming-intro.adoc | 30 -- .../dynamic-programming-knapsack-problem.adoc | 52 --- book/chapters/dynamic-programming.adoc | 16 - book/chapters/epigraph.adoc | 4 - book/chapters/greedy-algorithms-intro.adoc | 50 --- .../greedy-algorithms-knapsack-problem.adoc | 57 --- book/chapters/greedy-algorithms.adoc | 9 - book/chapters/heap-sort.adoc | 7 - book/chapters/heap.adoc | 3 - book/chapters/index.adoc | 2 - .../insertion-selection-bubble-sort.adoc | 3 - book/chapters/map-intro.adoc | 26 -- book/chapters/map.adoc | 18 - .../non-linear-data-structures-intro.adoc | 12 - book/chapters/part1.adoc | 20 - book/chapters/part2.adoc | 29 -- book/chapters/part3.adoc | 63 --- book/chapters/part4.adoc | 62 --- book/chapters/red-black-tree.adoc | 3 - book/chapters/sample.adoc | 359 ------------------ book/chapters/sorting-intro.adoc | 20 - book/chapters/sorting-properties.adoc | 78 ---- book/chapters/sorting-summary.adoc | 35 -- book/chapters/timsort.adoc | 63 --- book/chapters/trie.adoc | 3 - book/config | 2 +- .../colophon.adoc => content/colophon.asc} | 5 +- book/content/cover.png | Bin 0 -> 114081 bytes book/content/dedication.asc | 4 + book/content/introduction.asc | 59 +++ .../part01/algorithms-analysis.asc} | 32 +- .../part01/big-o-examples.asc} | 107 +++--- .../array-vs-list-vs-queue-vs-stack.asc} | 22 +- .../array.adoc => content/part02/array.asc} | 32 +- .../part02/linked-list.asc} | 63 +-- .../queue.adoc => content/part02/queue.asc} | 17 +- .../stack.adoc => content/part02/stack.asc} | 19 +- .../part03/binary-search-tree-traversal.asc} | 12 +- .../part03/binary-search-tree.asc} | 36 +- .../part03/graph-search.asc} | 66 ++-- .../graph.adoc => content/part03/graph.asc} | 55 +-- .../part03/hashmap.asc} | 29 +- .../part03/map.asc} | 40 +- .../set.adoc => content/part03/set.asc} | 33 +- .../time-complexity-graph-data-structures.asc | 25 ++ .../part03/tree-intro.asc} | 47 +-- .../part03/tree-search-traversal.asc} | 30 +- .../part03/treemap.asc} | 13 +- .../part04/algorithmic-toolbox.asc} | 10 +- .../part04/backtracking.asc} | 16 +- .../part04/bubble-sort.asc} | 16 +- .../part04/divide-and-conquer.asc} | 32 +- book/content/part04/dynamic-programming.asc | 62 +++ book/content/part04/greedy-algorithms.asc | 105 +++++ .../part04/insertion-sort.asc} | 15 +- .../part04/merge-sort.asc} | 21 +- .../part04/quick-sort.asc} | 19 +- .../part04/selection-sort.asc} | 19 +- book/content/part04/sorting-algorithms.asc | 142 +++++++ .../preface.adoc => content/preface.asc} | 16 +- book/custom-variables.adoc | 2 - book/dsajs.asc | 65 ++++ book/images/Find-the-largest-sum.png | Bin 0 -> 16292 bytes .../Recursive-Fibonacci-call-tree-with-dp.png | Bin 0 -> 17827 bytes book/images/Words-Permutations.png | Bin 0 -> 47291 bytes book/images/cover-a41.png | Bin 0 -> 51986 bytes book/{cover.png => images/cover-a42.png} | Bin book/images/cover.png | Bin 104354 -> 114081 bytes book/images/directed-graph.png | Bin 0 -> 16746 bytes book/images/recursive-fibonacci-call-tree.png | Bin 0 -> 52743 bytes book/index.asc | 5 + book/lab/greetings.pdf | Bin 10630 -> 0 bytes book/lab/prawn_test.rb | 6 - book/lab/prawn_view.rb | 37 -- book/lab/test.pdf | Bin 946 -> 0 bytes book/part01-algorithms-analysis.asc | 12 + ...adoc => part02-linear-data-structures.asc} | 31 +- book/part03-graph-data-structures.asc | 38 ++ ...ro.adoc => part04-algorithmic-toolbox.asc} | 24 +- book/sample-o.adoc | 47 --- book/sample.adoc | 70 ---- deprecated-README.adoc | 8 +- package-lock.json | 176 ++++++--- package.json | 8 +- 104 files changed, 1311 insertions(+), 2266 deletions(-) create mode 100644 book/A-time-complexity-cheatsheet.asc rename book/{chapters/tree-self-balancing-rotations.adoc => B-self-balancing-binary-search-trees.asc} (84%) rename book/{chapters/tree-avl.adoc => C-AVL-tree.asc} (77%) delete mode 100644 book/book-all.adoc delete mode 100644 book/book-o.adoc delete mode 100644 book/book.adoc create mode 100644 book/ch02-git-basics-chapter.asc delete mode 100644 book/chapters/about.adoc delete mode 100644 book/chapters/acknowledgements.adoc delete mode 100644 book/chapters/action.adoc delete mode 100644 book/chapters/appendix.adoc delete mode 100644 book/chapters/avl-tree.adoc delete mode 100644 book/chapters/cheatsheet.adoc delete mode 100644 book/chapters/dedication.adoc delete mode 100644 book/chapters/divide-and-conquer-intro.adoc delete mode 100644 book/chapters/divide-and-conquer.adoc delete mode 100644 book/chapters/dynamic-programming-fibonacci.adoc delete mode 100644 book/chapters/dynamic-programming-intro.adoc delete mode 100644 book/chapters/dynamic-programming-knapsack-problem.adoc delete mode 100644 book/chapters/dynamic-programming.adoc delete mode 100644 book/chapters/epigraph.adoc delete mode 100644 book/chapters/greedy-algorithms-intro.adoc delete mode 100644 book/chapters/greedy-algorithms-knapsack-problem.adoc delete mode 100644 book/chapters/greedy-algorithms.adoc delete mode 100644 book/chapters/heap-sort.adoc delete mode 100644 book/chapters/heap.adoc delete mode 100644 book/chapters/index.adoc delete mode 100644 book/chapters/insertion-selection-bubble-sort.adoc delete mode 100644 book/chapters/map-intro.adoc delete mode 100644 book/chapters/map.adoc delete mode 100644 book/chapters/non-linear-data-structures-intro.adoc delete mode 100644 book/chapters/part1.adoc delete mode 100644 book/chapters/part2.adoc delete mode 100644 book/chapters/part3.adoc delete mode 100644 book/chapters/part4.adoc delete mode 100644 book/chapters/red-black-tree.adoc delete mode 100644 book/chapters/sample.adoc delete mode 100644 book/chapters/sorting-intro.adoc delete mode 100644 book/chapters/sorting-properties.adoc delete mode 100644 book/chapters/sorting-summary.adoc delete mode 100644 book/chapters/timsort.adoc delete mode 100644 book/chapters/trie.adoc rename book/{chapters/colophon.adoc => content/colophon.asc} (87%) create mode 100644 book/content/cover.png create mode 100644 book/content/dedication.asc create mode 100644 book/content/introduction.asc rename book/{chapters/algorithms-analysis.adoc => content/part01/algorithms-analysis.asc} (90%) rename book/{chapters/big-o-examples.adoc => content/part01/big-o-examples.asc} (82%) rename book/{chapters/linear-data-structures-outro.adoc => content/part02/array-vs-list-vs-queue-vs-stack.asc} (57%) rename book/{chapters/array.adoc => content/part02/array.asc} (94%) rename book/{chapters/linked-list.adoc => content/part02/linked-list.asc} (89%) rename book/{chapters/queue.adoc => content/part02/queue.asc} (93%) rename book/{chapters/stack.adoc => content/part02/stack.asc} (91%) rename book/{chapters/tree-binary-tree-traversal.adoc => content/part03/binary-search-tree-traversal.asc} (94%) rename book/{chapters/tree-binary-search-tree.adoc => content/part03/binary-search-tree.asc} (91%) rename book/{chapters/graph-search.adoc => content/part03/graph-search.asc} (65%) rename book/{chapters/graph.adoc => content/part03/graph.asc} (91%) rename book/{chapters/map-hashmap.adoc => content/part03/hashmap.asc} (95%) rename book/{chapters/map-hashmap-vs-treemap.adoc => content/part03/map.asc} (55%) rename book/{chapters/set.adoc => content/part03/set.asc} (91%) create mode 100644 book/content/part03/time-complexity-graph-data-structures.asc rename book/{chapters/tree.adoc => content/part03/tree-intro.asc} (77%) rename book/{chapters/tree-search.adoc => content/part03/tree-search-traversal.asc} (84%) rename book/{chapters/map-treemap.adoc => content/part03/treemap.asc} (94%) rename book/{chapters/algorithmic-toolbox.adoc => content/part04/algorithmic-toolbox.asc} (90%) rename book/{chapters/backtracking.adoc => content/part04/backtracking.asc} (93%) rename book/{chapters/bubble-sort.adoc => content/part04/bubble-sort.asc} (85%) rename book/{chapters/divide-and-conquer-fibonacci.adoc => content/part04/divide-and-conquer.asc} (61%) create mode 100644 book/content/part04/dynamic-programming.asc create mode 100644 book/content/part04/greedy-algorithms.asc rename book/{chapters/insertion-sort.adoc => content/part04/insertion-sort.asc} (81%) rename book/{chapters/merge-sort.adoc => content/part04/merge-sort.asc} (82%) rename book/{chapters/quick-sort.adoc => content/part04/quick-sort.asc} (88%) rename book/{chapters/selection-sort.adoc => content/part04/selection-sort.asc} (78%) create mode 100644 book/content/part04/sorting-algorithms.asc rename book/{chapters/preface.adoc => content/preface.asc} (85%) delete mode 100644 book/custom-variables.adoc create mode 100644 book/dsajs.asc create mode 100644 book/images/Find-the-largest-sum.png create mode 100644 book/images/Recursive-Fibonacci-call-tree-with-dp.png create mode 100644 book/images/Words-Permutations.png create mode 100644 book/images/cover-a41.png rename book/{cover.png => images/cover-a42.png} (100%) create mode 100644 book/images/directed-graph.png create mode 100644 book/images/recursive-fibonacci-call-tree.png create mode 100644 book/index.asc delete mode 100644 book/lab/greetings.pdf delete mode 100644 book/lab/prawn_test.rb delete mode 100644 book/lab/prawn_view.rb delete mode 100644 book/lab/test.pdf create mode 100644 book/part01-algorithms-analysis.asc rename book/{chapters/linear-data-structures-intro.adoc => part02-linear-data-structures.asc} (59%) create mode 100644 book/part03-graph-data-structures.asc rename book/{chapters/algorithms-intro.adoc => part04-algorithmic-toolbox.asc} (73%) delete mode 100644 book/sample-o.adoc delete mode 100644 book/sample.adoc diff --git a/.circleci/config.yml b/.circleci/config.yml index cd95bb19..a50b5c40 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -104,7 +104,7 @@ jobs: # a collection of steps - run: name: generate PDF - command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" pdf + command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" - store_artifacts: path: book/dist diff --git a/.gitignore b/.gitignore index fedfe47e..363ed4fe 100644 --- a/.gitignore +++ b/.gitignore @@ -72,7 +72,6 @@ local.properties # Ruby ###################### /.bundle/ -/Gemfile.lock ###################### # Package Files @@ -136,13 +135,13 @@ Desktop.ini # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/fonts . # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/images . ###################### -Gemfile -Gemfile.lock -Makefile -_conf -_resources -extensions -fonts +# Gemfile +# Gemfile.lock +# Makefile +# _conf +# _resources +# extensions +# fonts ###################### diff --git a/README.md b/README.md index 64c0d55a..1d399c45 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![Slack](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) -> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the [npm package](https://www.npmjs.com/package/dsa.js). +> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. > In this repository, you can find the implementation of algorithms and data structures. They are implemented and explained in JavaScript. This material can be used as a reference manual for developers. You can refresh specific topics before an interview. Also, you can find ideas to solve problems more efficiently. @@ -21,7 +21,8 @@ https://img.shields.io/bundlephobia/min/dsa.js.svg - 16.7kB https://img.shields.io/github/repo-size/amejiarosario/dsa.js.svg - 98.1 MB --> -[![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png)](https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015) +![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png) + ## Table of Contents @@ -96,7 +97,7 @@ The topics are divided in 4 main categories as you can see below: _(You can click on the ⯈ to expand the topics)_ -### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part1.adoc) +### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part01-algorithms-analysis.asc) -- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linked-list.adoc): each data node has a link to the next (and +- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/linked-list.asc): each data node has a link to the next (and previous). [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js) | - [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/linked-list.adoc#linked-list-complexity-vs-array-complexity) + [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/linked-list.asc#linked-list-complexity-vs-array-complexity) -- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/queue.adoc): data flows in a "first-in, first-out" (FIFO) manner. +- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/queue.asc): data flows in a "first-in, first-out" (FIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/queues/queue.js) | - [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/queue.adoc#queue-complexity) + [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/queue.asc#queue-complexity) -- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/stack.adoc): data flows in a "last-in, first-out" (LIFO) manner. +- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/stack.asc): data flows in a "last-in, first-out" (LIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/stacks/stack.js) | - [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/stack.adoc#stack-complexity) + [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/stack.asc#stack-complexity) --- @@ -224,7 +225,7 @@ they take different time to complete. --- -#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linear-data-structures-outro.adoc) +#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/array-vs-list-vs-queue-vs-stack.asc) Use Arrays when… - You need to access data in random order fast (using an index). @@ -245,7 +246,7 @@ Use Linked Lists when: --- - #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part2.adoc) + #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part02-linear-data-structures.asc) Build any of these data structures from scratch: - [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/linked-lists/linked-list.js) @@ -257,7 +258,7 @@ Use Linked Lists when: -### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) +### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) @@ -270,13 +271,13 @@ Use Linked Lists when: --- -#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map.adoc) +#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/map.asc) Learn how to implement different types of Maps such as: -- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap.adoc) -- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-treemap.adoc) +- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/hashmap.asc) +- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/treemap.asc) -Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap-vs-treemap.adoc): +Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/time-complexity-graph-data-structures.asc): - `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. - `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. @@ -295,9 +296,9 @@ Also, [learn the difference between the different Maps implementations](https:// --- -#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) +#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) -##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/graph.adoc) +##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/graph.asc) Know all the graphs properties with many images and illustrations. @@ -308,9 +309,9 @@ Know all the graphs properties with many images and illustrations. parents, loops. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/graphs/graph.js) | - [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/graph.adoc#graph-complexity) + [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/graph.asc#graph-complexity) -#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree.adoc) +#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/tree-intro.asc) Learn all the different kinds of trees and its properties. @@ -321,29 +322,29 @@ Learn all the different kinds of trees and its properties. graph not a tree. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc) - **Binary Trees**: same as tree but only can have two children at most. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc#binary-tree) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc#binary-tree) - **Binary Search Trees** (BST): same as binary tree, but the nodes value keep this order `left < parent < right`. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/binary-search-tree.js) | - [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-binary-search-tree.adoc#tree-complexity) + [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/binary-search-tree.asc#tree-complexity) - **AVL Trees**: Self-balanced BST to maximize look up time. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/avl-tree.js) | - [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-avl.adoc) + [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/C-AVL-tree.asc) | - [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-self-balancing-rotations.adoc) + [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/B-self-balancing-binary-search-trees.asc) - **Red-Black Trees**: Self-balanced BST more loose than AVL to @@ -361,12 +362,12 @@ Learn all the different kinds of trees and its properties. --- -#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-binary-search-tree.adoc) +#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/binary-search-tree.asc) - Learn how to add/remove/update values in a tree: ![inserting node in a tree](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image36.png) -- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-self-balancing-rotations.adoc) +- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/B-self-balancing-binary-search-trees.asc) From unbalanced BST to balanced BST ``` @@ -383,7 +384,7 @@ From unbalanced BST to balanced BST -### ⚒ [Algorithms Techniques](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part4.adoc) +### ⚒ [Algorithmic Toolbox](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) @@ -397,7 +398,7 @@ From unbalanced BST to balanced BST --- -#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) +#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) 1. Understand the problem 1. Build a simple example (no edge cases yet) @@ -407,7 +408,7 @@ From unbalanced BST to balanced BST 1. Write Code, yes, now you can code. 1. Test your written code -Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) +Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) --- @@ -419,34 +420,34 @@ Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and- --- -#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/sorting-intro.adoc) +#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/sorting-algorithms.asc) We are going to explore three basic sorting algorithms O(n2) which have low overhead: - Bubble Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/bubble-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/bubble-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/bubble-sort.asc) - Insertion Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/insertion-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/insertion-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/insertion-sort.asc) - Selection Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/selection-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/selection-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/selection-sort.asc) and then discuss efficient sorting algorithms O(n log n) such as: - Merge Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/merge-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/merge-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/merge-sort.asc) - Quick sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/quick-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/quick-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/quick-sort.asc) --- @@ -458,13 +459,13 @@ and then discuss efficient sorting algorithms O(n log n) such as: --- -#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithms-intro.adoc) +#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) We are going to discuss the following techniques for solving algorithms problems: -- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/greedy-algorithms.adoc): makes greedy choices using heuristics to find the best solution without looking back. -- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/dynamic-programming.adoc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. -- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/divide-and-conquer.adoc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. -- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/backtracking.adoc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. +- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/bbook/content/part04/greedy-algorithms.asc): makes greedy choices using heuristics to find the best solution without looking back. +- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. +- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. +- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). --- diff --git a/book/A-time-complexity-cheatsheet.asc b/book/A-time-complexity-cheatsheet.asc new file mode 100644 index 00000000..64400aaa --- /dev/null +++ b/book/A-time-complexity-cheatsheet.asc @@ -0,0 +1,39 @@ +[appendix] +[[a-time-complexity-cheatsheet]] +== Cheatsheet + +This section summerize what we are going to cover in the rest of this book. + +=== Runtimes + +include::content/part01/big-o-examples.asc[tag=table] + +include::content/part01/algorithms-analysis.asc[tag=table] + +=== Linear Data Structures + +include::content/part02/array-vs-list-vs-queue-vs-stack.asc[tag=table] + +=== Trees and Maps Data Structures + +This section covers Binary Search Tree (BST) time complexity (Big O). + +include::content/part03/time-complexity-graph-data-structures.asc[tag=table] + +include::content/part03/graph.asc[tag=table] + +=== Sorting Algorithms + +include::content/part04/sorting-algorithms.asc[tag=table] + +// // https://algs4.cs.princeton.edu/cheatsheet/ +// // http://bigocheatsheet.com/ + +// // https://en.wikipedia.org/wiki/Timsort (Tim Peters) +// // https://bugs.python.org/file4451/timsort.txt +// // https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m + +// // https://en.wikipedia.org/wiki/Sorting_algorithm +// // http://sorting.at/ +// // https://www.toptal.com/developers/sorting-algorithms +// // https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/chapters/tree-self-balancing-rotations.adoc b/book/B-self-balancing-binary-search-trees.asc similarity index 84% rename from book/chapters/tree-self-balancing-rotations.adoc rename to book/B-self-balancing-binary-search-trees.asc index 51b41f9d..249f510c 100644 --- a/book/chapters/tree-self-balancing-rotations.adoc +++ b/book/B-self-balancing-binary-search-trees.asc @@ -1,9 +1,6 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Self-balancing Binary Search Trees +[appendix] +[[b-self-balancing-binary-search-trees]] +== Self-balancing Binary Search Trees Binary Search Trees (BST) are an excellent data structure to find elements very fast _O(log n)_. However, when the BST branches have different branch sizes, then the performance suffers. @@ -31,12 +28,13 @@ As you might notice, we balanced the tree in the example by doing a rotation. To be more specific we rotated node `1` to the left to balance the tree. Let's examine all the possible rotation we can do to balance a tree. -== Tree Rotations +[[tree-rotations]] +=== Tree Rotations (((Tree Rotations))) We can do single rotations left and right and also we can do double rotations. Let's go one by one. -=== Single Right Rotation +==== Single Right Rotation Right rotation moves a node on the right as a child of another node. @@ -48,7 +46,7 @@ So, we move node 3 as the right child of the previous child. .Single right rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=rightRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=rightRotation] ---- .In the `rightRotation` we identify 3 nodes: @@ -64,7 +62,7 @@ Take a look at the implementation. .Swap Parent and Child Implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=swapParentChild] +include::../src/data-structures/trees/tree-rotations.js[tag=swapParentChild] ---- After `swapParentChild`, we have the following: @@ -93,14 +91,14 @@ Check out the <> implementation again. It This rotation is also known as `RR rotation`. -=== Single Left Rotation +==== Single Left Rotation Left rotation is similar to the `rightRotation` we explained above. .Single left rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=leftRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=leftRotation] ---- As you can see, this function is just the opposite of `rightRotation`. Where ever we used the right now we use the left here and vice versa. @@ -111,36 +109,37 @@ If you are curious about the `setRightAndUpdateParent` and `setLeftAndUpdatePare .Set and update parent implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/binary-tree-node.js[tag=setAndUpdateParent] +include::../src/data-structures/trees/binary-tree-node.js[tag=setAndUpdateParent] ---- You can also check out the full https://github.com/amejiarosario/dsa.js/blob/adfd8a660bbe0a7068fd7881aff9f51bdb9f92ae/src/data-structures/trees/binary-tree-node.js#L9[binary tree node implementation]. -=== Left Right Rotation +==== Left Right Rotation This time are we going to do a double rotation. .Left-Right rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=leftRightRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=leftRightRotation] ---- As you can see we do a left and then a right rotation. This rotation is also known as `LR rotation` -=== Right Left Rotation +==== Right Left Rotation Very similar to `leftRightRotation`. The difference is that we rotate right and then left. .Right-Left rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=rightLeftRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=rightLeftRotation] ---- This rotation is also referred to as `RL rotation`. -== Self-balancing trees implementations +=== Self-balancing trees implementations So far, we have study how to make tree rotations which are the basis for self-balancing trees. There are different implementations of self-balancing trees such a Red-Black Tree and AVL Tree. + diff --git a/book/chapters/tree-avl.adoc b/book/C-AVL-tree.asc similarity index 77% rename from book/chapters/tree-avl.adoc rename to book/C-AVL-tree.asc index 8c4ed494..07bae068 100644 --- a/book/chapters/tree-avl.adoc +++ b/book/C-AVL-tree.asc @@ -1,9 +1,6 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= AVL Tree +[appendix] +[[c-avl-tree]] +== AVL Tree (((AVL Tree))) (((Tree, AVL))) AVL Tree is named after their inventors (**A**delson-**V**elsky and **L**andis). @@ -11,7 +8,7 @@ This self-balancing tree keeps track of subtree sizes to know if a rebalance is We can compare the size of the left and right subtrees using a balance factor. [NOTE] -==== +===== The *balanced factor* on each node is calculated recursively as follows: @@ -19,7 +16,7 @@ The *balanced factor* on each node is calculated recursively as follows: Balance Factor = (left subtree height) - (right subtree height) ---- -==== +===== The implementation will go in the BST node class. We will need two methods to calculate the left and right subtree, and with those, we can get the balance factor. @@ -27,18 +24,18 @@ We will need two methods to calculate the left and right subtree, and with those .Balance Factor methods on the BST node [source, javascript] ---- -include::{codedir}/data-structures/trees/binary-tree-node.js[tag=avl, indent=0] +include::../src/data-structures/trees/binary-tree-node.js[tag=avl, indent=0] ---- -== Implementing AVL Tree +=== Implementing AVL Tree Implementing an AVL Tree is not too hard since it builds upon what we did in the Binary Search Tree. .AVL Tree class [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=AvlTree] +include::../src/data-structures/trees/avl-tree.js[tag=AvlTree] ---- As you can see, the AVL tree inherits from the BST class. @@ -48,7 +45,7 @@ This function checks if the tree is symmetrical after every change to the tree. .Balance Upstream for AVL tree [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=balanceUpstream] +include::../src/data-structures/trees/avl-tree.js[tag=balanceUpstream] ---- This function recursively goes from the modified node to the root checking if each node in between is balanced. @@ -57,10 +54,10 @@ Now, let's examine how does the balancing works on AVL tree. .Balance method for AVL tree [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=balance] +include::../src/data-structures/trees/avl-tree.js[tag=balance] ---- The first thing we do is to see if one subtree is longer than the other. If so, then we check the children balance to determine if need a single or double rotation and in which direction. -You can review <> in case you want a refresher. +You can review <> in case you want a refresher. diff --git a/book/book-all.adoc b/book/book-all.adoc deleted file mode 100644 index 5c872247..00000000 --- a/book/book-all.adoc +++ /dev/null @@ -1,155 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -ifndef::backend-epub3[:leveloffset: +1] -include::chapters/dedication.adoc[] -ifndef::backend-epub3[:leveloffset: -1] - -// TODO: pending -include::chapters/preface.adoc[] - -include::chapters/cheatsheet.adoc[] - -// add sections to chapters -:sectnums: - -// -// chapters -// - -= Algorithms Analysis - -// TODO: pending -include::chapters/algorithms-analysis-intro.adoc[] - -:leveloffset: +1 - -include::chapters/algorithms-analysis.adoc[] - -include::chapters/big-o-examples.adoc[] - -:leveloffset: -1 - -= Linear Data Structures - -include::chapters/linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -include::chapters/array.adoc[] - -include::chapters/linked-list.adoc[] - -include::chapters/stack.adoc[] - -include::chapters/queue.adoc[] - -:leveloffset: -1 - -= Non-Linear Data Structures - -include::chapters/non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -include::chapters/tree.adoc[] - -include::chapters/binary-search-tree.adoc[] - -include::chapters/map.adoc[] - -include::chapters/set.adoc[] - -include::chapters/graph.adoc[] - - -:leveloffset: -1 - -= Advanced Non-Linear Data Structures - -// TODO: pending -include::chapters/non-linear-data-structures-intro-advanced.adoc[] - -:leveloffset: +1 - -// TODO: pending -include::chapters/avl-tree.adoc[] - -// TODO: pending (optional) -// include::chapters/red-black-tree.adoc[] - -// TODO: pending -include::chapters/heap.adoc[] - -// TODO: (optional) pending -// include::chapters/trie.adoc[] - - -:leveloffset: -1 - -= Algorithms - -// TODO: pending -include::chapters/algorithms-intro.adoc[] - -:leveloffset: +1 - -// TODO: pending -include::chapters/sorting-intro.adoc[] - -// -// Slow Sorting -// - -include::chapters/insertion-sort.adoc[] - -include::chapters/selection-sort.adoc[] - -include::chapters/bubble-sort.adoc[] - -// -// Fast Sorting -// - -include::chapters/merge-sort.adoc[] - -include::chapters/quick-sort.adoc[] - -// TODO: (optional) pending -// include::chapters/heap-sort.adoc[] - -// TODO: (optional) pending -// include::chapters/tim-sort.adoc[] - -// -// Searching -// - -// TODO: pending -include::chapters/graph-search.adoc[] - -:leveloffset: -1 - -// -// end chapters -// - -include::chapters/epigraph.adoc[] - -// TODO: (optional) pending -// include::chapters/appendix.adoc[] - -// TODO: (optional) pending -ifdef::backend-pdf[] -include::chapters/index.adoc[] -endif::[] - diff --git a/book/book-o.adoc b/book/book-o.adoc deleted file mode 100644 index 6fc2744b..00000000 --- a/book/book-o.adoc +++ /dev/null @@ -1,194 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia (g) -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -ifndef::backend-epub3[:leveloffset: +1] -include::chapters/dedication.adoc[] -ifndef::backend-epub3[:leveloffset: -1] - -// (g) -include::chapters/preface.adoc[] - -// add sections to chapters -:sectnums: - - -//----------------------------------- -// TODO: commment out sample on final -//----------------------------------- - -include::chapters/sample.adoc[] - -//----------------------------------- -// TODO: end remove ------ -//----------------------------------- - -// -// chapters -// - -= Algorithms Analysis - -include::chapters/algorithms-analysis-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/algorithms-analysis.adoc[] - -// (g) -include::chapters/big-o-examples.adoc[] - -:leveloffset: -1 - -= Linear Data Structures - -// (g) -include::chapters/linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/array.adoc[] - -// (g) -include::chapters/linked-list.adoc[] - -// (g) -include::chapters/stack.adoc[] - -// (g) -include::chapters/queue.adoc[] - -// (g) -include::chapters/linear-data-structures-outro.adoc[] - -:leveloffset: -1 - - -= Non-Linear Data Structures - -// (g) -include::chapters/non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/tree.adoc[] - - -// (g) -include::chapters/tree-binary-search-tree.adoc[] - -include::chapters/tree-search.adoc[] - -include::chapters/tree-self-balancing-rotations.adoc[] - -:leveloffset: +1 - -include::chapters/tree-avl.adoc[] - -:leveloffset: -1 - -// (g) -// include::chapters/map.adoc[] -include::chapters/map-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/map-hashmap.adoc[] - -// (g) -include::chapters/map-treemap.adoc[] - -// (g) -include::chapters/map-hashmap-vs-treemap.adoc[] - -:leveloffset: -1 - -// (g) -include::chapters/set.adoc[] - -// (g) -include::chapters/graph.adoc[] - -// TODO: pending -include::chapters/graph-search.adoc[] - -:leveloffset: -1 - -= Algorithmic Techniques - -// TODO: pending -include::chapters/algorithms-intro.adoc[] - -:leveloffset: +1 - -// -// Sorting algorithms -// -= Sorting Algorithms - -:leveloffset: +1 - -// TODO: pending -include::chapters/sorting-intro.adoc[] - -// Slow Sorting - -include::chapters/insertion-sort.adoc[] - -include::chapters/selection-sort.adoc[] - -include::chapters/bubble-sort.adoc[] - -// Fast Sorting - -include::chapters/merge-sort.adoc[] - -include::chapters/quick-sort.adoc[] - -:leveloffset: -1 - - -// -// Algorithms Techniques -// - -include::chapters/divide-and-conquer.adoc[] - -include::chapters/dynamic-programming.adoc[] - -include::chapters/greedy-algorithms.adoc[] - -include::chapters/backtracking.adoc[] - -// --- end algorithms --- - -:leveloffset: -1 - -:sectnums!: - -= Appendix - -:leveloffset: +1 - -// TODO: review and complete when the rest is completed -include::chapters/cheatsheet.adoc[] - -:leveloffset: -1 - -// -// end chapters -// - -include::chapters/epigraph.adoc[] diff --git a/book/book.adoc b/book/book.adoc deleted file mode 100644 index 4e0ad075..00000000 --- a/book/book.adoc +++ /dev/null @@ -1,84 +0,0 @@ -= Data Structures and Algorithms in JavaScript -:book-title: {doctitle} -:author: Adrian Mejia -:email: hello+dsajs@adrianmejia.com -:revnumber: 1.0.0 -:revdate: {docdate} -:revyear: 2019 -:revremark: First Edition -:subject: Algorithms -:keywords: dsa.js, Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees -:doctype: book -:media: screen -ifeval::["{media}" != "prepress"] -:front-cover-image: image:cover-a4.png[Front Cover,595,842] -endif::[] -:toc: -:toclevels: 3 -:icons: font -:lang: en -:language: javascript -:experimental: -:pdf-fontsdir: ./fonts -:pdf-stylesdir: ./_resources/pdfstyles -:pdf-style: adrian-screen -:title-logo-image: image:logo.png[Logo,50,50] -// custom variables -:imagesdir: {docdir}/images -:codedir: ../../src -:datadir: {docdir}/data -// :source-highlighter: pygments -// paraiso-light, xcode, monokai -// :pygments-style: xcode -:stem: -:plantuml-config: {docdir}/_conf/umlconfig.txt -// :hide-uri-scheme: -// :chapter-label: Chapter -// :appendix-caption: Appendix -// :chapter-label: -// dark -// :pygments-style: monokai -// light theme with colorful code -// solarized-light, tomorrow -// :source-highlighter: highlightjs -// :highlightjs-theme: tomorrow - -ifndef::ebook-format[:leveloffset: 1] - -[colophon#colophon%nonfacing] -include::chapters/colophon.adoc[] - -[dedication] -include::chapters/dedication.adoc[] - -// [%nonfacing] -// include::chapters/acknowledgements.adoc[] - -[preface] -include::chapters/preface.adoc[] - -// include::chapters/introduction.adoc[] - -// TODO: (optional) include numbers but need to fix the part/chapter labels -// :sectnums: - -include::chapters/part1.adoc[] - -include::chapters/part2.adoc[] - -include::chapters/part3.adoc[] - -include::chapters/part4.adoc[] - -// :sectnums!: - -include::chapters/appendix.adoc[] - -// include::chapters/epigraph.adoc[] - -// include::chapters/about.adoc[] - -ifdef::backend-pdf,backend-docbook[] -[index] -= Index -endif::[] diff --git a/book/ch02-git-basics-chapter.asc b/book/ch02-git-basics-chapter.asc new file mode 100644 index 00000000..cb91537b --- /dev/null +++ b/book/ch02-git-basics-chapter.asc @@ -0,0 +1,35 @@ +[[ch02-git-basics-chapter]] +== Git Basics + +If you can read only one chapter to get going with Git, this is it. +This chapter covers every basic command you need to do the vast majority of the things you'll eventually spend your time doing with Git. +By the end of the chapter, you should be able to configure and initialize a repository, begin and stop tracking files, and stage and commit changes. +We'll also show you how to set up Git to ignore certain files and file patterns, how to undo mistakes quickly and easily, how to browse the history of your project and view changes between commits, and how to push and pull from remote repositories. + +[[links]] +=== Links + +.Links to DSA +- Chapter: <> +- Section: <> + +// In <> we used it to specify our name, email address and editor preference before we even got started using Git. + +[source,console] +---- +$ git commit +---- + +Doing so launches your editor of choice. +(This is set by your shell's `EDITOR` environment variable -- usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in + +// <>).(((editor, changing default)))(((git commands, config))) + + + + + +=== Summary + +At this point, you can do all the basic local Git operations -- creating or cloning a repository, making changes, staging and committing those changes, and viewing the history of all the changes the repository has been through. +Next, we'll cover Git's killer feature: its branching model. diff --git a/book/chapters/about.adoc b/book/chapters/about.adoc deleted file mode 100644 index 73d625c5..00000000 --- a/book/chapters/about.adoc +++ /dev/null @@ -1 +0,0 @@ -= About the author diff --git a/book/chapters/acknowledgements.adoc b/book/chapters/acknowledgements.adoc deleted file mode 100644 index 37ecc759..00000000 --- a/book/chapters/acknowledgements.adoc +++ /dev/null @@ -1 +0,0 @@ -= Acknowledgements diff --git a/book/chapters/action.adoc b/book/chapters/action.adoc deleted file mode 100644 index 1e88adb2..00000000 --- a/book/chapters/action.adoc +++ /dev/null @@ -1,4 +0,0 @@ -[[action]] -= Action! - -== Additional reading diff --git a/book/chapters/appendix.adoc b/book/chapters/appendix.adoc deleted file mode 100644 index 50074282..00000000 --- a/book/chapters/appendix.adoc +++ /dev/null @@ -1,3 +0,0 @@ -// Appendix A: -include::cheatsheet.adoc[] - diff --git a/book/chapters/avl-tree.adoc b/book/chapters/avl-tree.adoc deleted file mode 100644 index 569c30df..00000000 --- a/book/chapters/avl-tree.adoc +++ /dev/null @@ -1,5 +0,0 @@ -= AVL Tree - -The AVL tree builds on top of a <> and it keeps it balanced on insertions. It prevents a BST worst case scenario when the tree is totally unbalanced to one side (similar to linked list), then it takes O(n) to find an element instead of O(log n). - - diff --git a/book/chapters/cheatsheet.adoc b/book/chapters/cheatsheet.adoc deleted file mode 100644 index 06308b35..00000000 --- a/book/chapters/cheatsheet.adoc +++ /dev/null @@ -1,38 +0,0 @@ -[appendix] -= Time Complexity Cheatsheet - -This section summerize what we are going to cover in the rest of this book. - -== Runtimes - -include::big-o-examples.adoc[tag=table] - -include::algorithms-analysis.adoc[tag=table] - -== Linear Data Structures - -include::linear-data-structures-outro.adoc[tag=table] - -== Trees and Maps Data Structures - -This section covers Binary Search Tree (BST) time complexity (Big O). - -include::part3.adoc[tag=table] - -include::graph.adoc[tag=table] - -== Sorting Algorithms - -include::sorting-summary.adoc[tag=table] - -// https://algs4.cs.princeton.edu/cheatsheet/ -// http://bigocheatsheet.com/ - -// https://en.wikipedia.org/wiki/Timsort (Tim Peters) -// https://bugs.python.org/file4451/timsort.txt -// https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m - -// https://en.wikipedia.org/wiki/Sorting_algorithm -// http://sorting.at/ -// https://www.toptal.com/developers/sorting-algorithms -// https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/chapters/dedication.adoc b/book/chapters/dedication.adoc deleted file mode 100644 index e9c9590b..00000000 --- a/book/chapters/dedication.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[dedication] -= Dedication - -To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail. - diff --git a/book/chapters/divide-and-conquer-intro.adoc b/book/chapters/divide-and-conquer-intro.adoc deleted file mode 100644 index 5876599f..00000000 --- a/book/chapters/divide-and-conquer-intro.adoc +++ /dev/null @@ -1,17 +0,0 @@ -(((Divide and Conquer))) -(((Algorithmic Techniques, Divide and Conquer))) -Divide and conquer is a strategy for solving algorithmic problems. -It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. - -We have already implemented some algorithms using the divide and conquer technique. - -.Examples of divide and conquer algorithms: -- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. -- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. -- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. -- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. - -.In general, the divide and conquer algorithms have the following pattern: -1. *Divide* data into subproblems. -2. *Conquer* each subproblem. -3. *Combine* results. diff --git a/book/chapters/divide-and-conquer.adoc b/book/chapters/divide-and-conquer.adoc deleted file mode 100644 index b394687c..00000000 --- a/book/chapters/divide-and-conquer.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Divide and Conquer - -include::divide-and-conquer-intro.adoc[] - -:leveloffset: +1 - -include::divide-and-conquer-fibonacci.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/dynamic-programming-fibonacci.adoc b/book/chapters/dynamic-programming-fibonacci.adoc deleted file mode 100644 index 86e513ec..00000000 --- a/book/chapters/dynamic-programming-fibonacci.adoc +++ /dev/null @@ -1,35 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Fibonacci Sequence with Dynamic Programming -(((Fibonacci))) -Let's solve the same Fibonacci problem but this time with dynamic programming. - -When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. - -.Recursive Fibonacci Implemenation using Dynamic Programming -[source, javascript] ----- -include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] ----- - -This implementation checks if we already calculated the value, if so it will save it for later use. - -[graphviz, Recursive Fibonacci call tree with dp, svg] -.... -graph G { - "fib(5)" -- { "fib(4)" } - "fib(4)" -- { "fib(3)" } - "fib(3)" -- { "fib(2)" } - "fib(2)" -- { "fib(1)", "fib(0)" } -} -.... - -This graph looks pretty linear now. It's runtime _O(n)_! -(((Linear))) -(((Runtime, Linear))) - -(((Memoization))) -TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/chapters/dynamic-programming-intro.adoc b/book/chapters/dynamic-programming-intro.adoc deleted file mode 100644 index f40e9371..00000000 --- a/book/chapters/dynamic-programming-intro.adoc +++ /dev/null @@ -1,30 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -(((Dynamic Programming))) -(((Algorithmic Techniques, Dynamic Programming))) -Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. - -// https://twitter.com/amejiarosario/status/1103050924933726208 -// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson -// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 -// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem - -.How to explain dynamic programming to kids? 👶 -**** - -$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ - ---{sp} What's that equal to? - ---{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! - ---{sp} Add another "+1". What's the total now? - ---{sp} $$*$$*_Quickly_*$$*$$ Eleven! - ---{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." -**** - diff --git a/book/chapters/dynamic-programming-knapsack-problem.adoc b/book/chapters/dynamic-programming-knapsack-problem.adoc deleted file mode 100644 index b581632f..00000000 --- a/book/chapters/dynamic-programming-knapsack-problem.adoc +++ /dev/null @@ -1,52 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Knapsack Problem - -The knapsack (backpack [big]#🎒#) problem is the following: - -> A thief breaks into a museum with a backpack that can carry certain weight. -What items shoud he pick to maximize his loot? - -Take a look at the following example to understand better the problem. - -.Knapsack Problem Examples -[source, javascript] ----- - -// Input: -const museumGoods = [ - { value: 1, weight: 1}, - { value: 4, weight: 3 }, - { value: 5, weight: 4 }, - { value: 7, weight: 5 }, -] - -const maxBackpackWeight = 7; - -// Solution: -const backpack = solveKnapsackProblem(museumGoods, maxBackpackWeight); - -// Output: -expect(backpack.items).to.equal([ - { value: 4, weight: 3 }, - { value: 5, weight: 4 } -]) - -expect(backpack.weight).toBeLessThanOrEqual(7); -expect(backpack.value).toBe(9); ----- - -How can we solve this problem? You cannot take them all since total weight is 13 and we only can carry 7. You should not take only one, since that would not be the maximum loot and you would - -One idea would be sort the items by weight and take the items if they do not exceed the max weight. -In that case, the result would be: - ----- - { value: 7, weight: 5 }, - { value: 1, weight: 1}, ----- - -As you can see, this solution is not optimal. The value total value is `8` and the weight just `6`. diff --git a/book/chapters/dynamic-programming.adoc b/book/chapters/dynamic-programming.adoc deleted file mode 100644 index 269a4178..00000000 --- a/book/chapters/dynamic-programming.adoc +++ /dev/null @@ -1,16 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Dynamic Programming - -include::dynamic-programming-intro.adoc[] - -:leveloffset: +1 - -include::dynamic-programming-fibonacci.adoc[] - -// include::chapters/dynamic-programming-knapsack-problem.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/epigraph.adoc b/book/chapters/epigraph.adoc deleted file mode 100644 index a70dd6d3..00000000 --- a/book/chapters/epigraph.adoc +++ /dev/null @@ -1,4 +0,0 @@ -[epigraph] -= Epigraph - -Thanks for reading this book. Stay effective! diff --git a/book/chapters/greedy-algorithms-intro.adoc b/book/chapters/greedy-algorithms-intro.adoc deleted file mode 100644 index f97bb42a..00000000 --- a/book/chapters/greedy-algorithms-intro.adoc +++ /dev/null @@ -1,50 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -(((Greedy Algorithms))) -(((Algorithmic Techniques, Greedy Algorithms))) -Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. -They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. - -An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. - -[graphviz, Find the largest sum, svg] -.... -graph G { - 5 -- 3 [color="#B8E986", penwidth=2] - 5 -- 7 [color="#FF5252", penwidth=2] - 3 -- 87 [color="#B8E986", penwidth=2] - 3 -- 1 - 7 -- 2 - 7 -- 4 [color="#FF5252", penwidth=2] - - label="Optimal vs. Greedy path" -} -.... - -Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. - -Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. - -[TIP] -==== -Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. -This algorithm only gives one shot at finding the solution and never goes back to consider other options. -==== - -Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. - -.Some examples of greedy algorithms that works well: -- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. -- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. -indexterm:[Merge Sort] - - -.In general, we can follow these steps to design Greedy Algorithms: -1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). -2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. -3. Reduce the processed input and repeat step #1 and #2 until all data is gone. -4. Return solution. -5. Check correctness with different examples and edge cases. diff --git a/book/chapters/greedy-algorithms-knapsack-problem.adoc b/book/chapters/greedy-algorithms-knapsack-problem.adoc deleted file mode 100644 index 7993b180..00000000 --- a/book/chapters/greedy-algorithms-knapsack-problem.adoc +++ /dev/null @@ -1,57 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Fractional Knapsack Problem - -We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: - -> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? - -Let's say we have the following items available. - -.Knpasack Input -[source, javascript] ----- -const items = [ - { value: 1, weight: 1}, - { value: 4, weight: 3 }, - { value: 5, weight: 4 }, - { value: 7, weight: 5 }, -]; - -const maxWeight = 7; ----- - -So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. - -How would you solve this problem? - -First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: - -- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. - -- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# - -- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# - -.Items value/weight ratio ----- - { value: 1, weight: 1 }, // 1/1 = 1 - { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ - { value: 5, weight: 4 }, // 5/4 = 1.25 - { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ ----- - -Let's implement this algorithm! - -.Factional Knapsack Problem Implementation -[source, javascript] ----- -include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] ----- - -What's the runtime of this algorithm? - -We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/chapters/greedy-algorithms.adoc b/book/chapters/greedy-algorithms.adoc deleted file mode 100644 index 43685ec7..00000000 --- a/book/chapters/greedy-algorithms.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Greedy Algorithms - -include::greedy-algorithms-intro.adoc[] - -:leveloffset: +1 - -include::greedy-algorithms-knapsack-problem.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/heap-sort.adoc b/book/chapters/heap-sort.adoc deleted file mode 100644 index 421cab79..00000000 --- a/book/chapters/heap-sort.adoc +++ /dev/null @@ -1,7 +0,0 @@ -= Heap Sort - -Voluptate consequat magna laborum consectetur fugiat deserunt. Id sit est ullamco magna sint laborum proident. Exercitation cupidatat exercitation excepteur ex pariatur qui qui sint amet consectetur laborum ex mollit dolore. - -Et do sunt do labore culpa est eu ut fugiat eiusmod ea excepteur. Irure commodo adipisicing in aute aliquip laborum laboris reprehenderit incididunt in sunt. Cupidatat veniam est culpa ex eu aute voluptate tempor aliqua ullamco sunt et consectetur. Eu laboris mollit culpa consequat. Sunt mollit quis dolor nostrud. In duis mollit do adipisicing veniam do deserunt exercitation Lorem deserunt aliquip. Ea esse reprehenderit incididunt eu deserunt sit nulla sint non eiusmod nisi eu et irure. - -Ad commodo anim nulla occaecat non. Aute fugiat laborum ut mollit exercitation aute proident reprehenderit culpa consectetur. Cillum officia laborum proident labore sunt est eiusmod proident. Lorem nostrud ea qui tempor culpa ullamco ipsum. Dolore nulla minim qui incididunt qui sint consectetur quis tempor esse minim. Do id consequat commodo sit officia aliqua officia reprehenderit eiusmod elit do amet. diff --git a/book/chapters/heap.adoc b/book/chapters/heap.adoc deleted file mode 100644 index 104af153..00000000 --- a/book/chapters/heap.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Heap - -Sit nostrud Lorem nulla ipsum occaecat enim eiusmod adipisicing velit et cupidatat laboris incididunt. Sunt ex eiusmod amet nulla quis. Officia elit non sunt esse sint. Non enim do laborum adipisicing officia et aliquip cillum ut nisi ipsum. Minim duis minim velit amet laborum aliquip pariatur irure deserunt ex. diff --git a/book/chapters/index.adoc b/book/chapters/index.adoc deleted file mode 100644 index 85e81b85..00000000 --- a/book/chapters/index.adoc +++ /dev/null @@ -1,2 +0,0 @@ -[index] -= Index diff --git a/book/chapters/insertion-selection-bubble-sort.adoc b/book/chapters/insertion-selection-bubble-sort.adoc deleted file mode 100644 index 4b0ea8e2..00000000 --- a/book/chapters/insertion-selection-bubble-sort.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Insertion vs Selection vs Bubble Sort - -All these three algorithms diff --git a/book/chapters/map-intro.adoc b/book/chapters/map-intro.adoc deleted file mode 100644 index 9bbd3849..00000000 --- a/book/chapters/map-intro.adoc +++ /dev/null @@ -1,26 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Map -(((Map))) -(((Data Structures, Non-Linear, Map))) -A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. - -IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. - -Many languages have maps already built-in. JavaScript/Node has `Map`: - -.JavaScript Built-in Map Usage -[source, javascript] ----- -include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] ----- - -In short, you set `key`/`value` pair and then you can get the `value` using the `key`. - -The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: - -* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. -* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. diff --git a/book/chapters/map.adoc b/book/chapters/map.adoc deleted file mode 100644 index 63307e68..00000000 --- a/book/chapters/map.adoc +++ /dev/null @@ -1,18 +0,0 @@ -<<< -include::map-intro.adoc[] - -:leveloffset: +1 - -// (g) -<<< -include::map-hashmap.adoc[] - -// (g) -<<< -include::map-treemap.adoc[] - -// (g) -<<< -include::map-hashmap-vs-treemap.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/non-linear-data-structures-intro.adoc b/book/chapters/non-linear-data-structures-intro.adoc deleted file mode 100644 index 0a1455e1..00000000 --- a/book/chapters/non-linear-data-structures-intro.adoc +++ /dev/null @@ -1,12 +0,0 @@ -[partintro] --- -Non-Linear data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. - -.In this chapter we are going to learn: -- Exciting <> data structure applications -- Searching efficiently with a <> data structures. -- One of the most versatile data structure of all <>. -- Keeping dups out with a <>. - -By the end of this section, you will know the data structures trade-offs and when to use one over the other. --- diff --git a/book/chapters/part1.adoc b/book/chapters/part1.adoc deleted file mode 100644 index 1b262f58..00000000 --- a/book/chapters/part1.adoc +++ /dev/null @@ -1,20 +0,0 @@ -[[chapter-1]] -= Algorithms Analysis - -[partintro] --- -In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. --- - - -:leveloffset: +1 - -// (g) -include::algorithms-analysis.adoc[] - -// (g) -include::big-o-examples.adoc[] - -:leveloffset: -1 - - diff --git a/book/chapters/part2.adoc b/book/chapters/part2.adoc deleted file mode 100644 index 7bc821d0..00000000 --- a/book/chapters/part2.adoc +++ /dev/null @@ -1,29 +0,0 @@ -[[chapter-2]] -= Linear Data Structures - -// (g) -include::linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::array.adoc[] - -// (g) -<<< -include::linked-list.adoc[] - -// (g) -<<< -include::stack.adoc[] - -// (g) -<<< -include::queue.adoc[] - -// (g) -<<< -include::linear-data-structures-outro.adoc[] - -:leveloffset: -1 - diff --git a/book/chapters/part3.adoc b/book/chapters/part3.adoc deleted file mode 100644 index f64d9d2f..00000000 --- a/book/chapters/part3.adoc +++ /dev/null @@ -1,63 +0,0 @@ -[[chapter-3]] -= Non-Linear Data Structures - -// (g) -include::non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::tree.adoc[] - - -// (g) -<<< -include::tree-binary-search-tree.adoc[] - -<<< -include::tree-search.adoc[] - -<<< -include::tree-self-balancing-rotations.adoc[] - -:leveloffset: +1 - -<<< -include::tree-avl.adoc[] - -:leveloffset: -1 - -// (g) -include::map.adoc[] - -// (g) -include::set.adoc[] - -// (g) -include::graph.adoc[] - -include::graph-search.adoc[] - -// Graph summary -= Summary - -In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. -(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) - -// tag::table[] -.Time and Space Complexity for Non-Linear Data Structures -|=== -.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity -^|_Index/Key_ ^|_Value_ -| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) -| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -|=== -{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. -// end::table[] - -:leveloffset: -1 diff --git a/book/chapters/part4.adoc b/book/chapters/part4.adoc deleted file mode 100644 index 2494091a..00000000 --- a/book/chapters/part4.adoc +++ /dev/null @@ -1,62 +0,0 @@ -[[chapter-4]] -= Algorithmic Techniques - -// TODO: pending -include::algorithms-intro.adoc[] - -:leveloffset: +1 - -include::sorting-intro.adoc[] - -:leveloffset: +1 - -include::sorting-properties.adoc[] - - -// Slow Sorting -<<< -include::bubble-sort.adoc[] - -<<< -include::insertion-sort.adoc[] - -<<< -include::selection-sort.adoc[] - - -// include::insertion-selection-bubble-sort.adoc[] - -// Fast Sorting -<<< -include::merge-sort.adoc[] - -<<< -include::quick-sort.adoc[] - -<<< -include::sorting-summary.adoc[] - -:leveloffset: -1 - - -// -// Algorithms Techniques -// -<<< -include::divide-and-conquer.adoc[] - -<<< -include::dynamic-programming.adoc[] - -<<< -include::greedy-algorithms.adoc[] - -<<< -include::backtracking.adoc[] - -<<< -include::algorithmic-toolbox.adoc[] - -// --- end algorithms --- - -:leveloffset: -1 diff --git a/book/chapters/red-black-tree.adoc b/book/chapters/red-black-tree.adoc deleted file mode 100644 index 40c414b2..00000000 --- a/book/chapters/red-black-tree.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Red-Black Tree - -Nisi ex aliqua minim commodo cupidatat proident sint fugiat commodo irure. Duis quis ullamco ut veniam pariatur cillum voluptate irure. Irure aliqua elit cupidatat exercitation eiusmod et duis mollit proident reprehenderit ad. Aute aliquip cillum nostrud irure quis. Sint reprehenderit voluptate adipisicing amet ut aliquip. Eiusmod laborum nisi eu irure est consectetur ut ex sit cupidatat non. diff --git a/book/chapters/sample.adoc b/book/chapters/sample.adoc deleted file mode 100644 index 142de0af..00000000 --- a/book/chapters/sample.adoc +++ /dev/null @@ -1,359 +0,0 @@ -[[chapter-3]] -= Sample Section - - -:leveloffset: +1 - -// ------------------ - - -= Sample Title 1 - -((Provident)) architecto soluta `commodi` odit accusamus non molestias necessitatibus, culpa possimus repudiandae, ex sit officiis, sint hic doloribus harum vero quisquam aspernatur. - -Voluptate minim `laborum` velit irure labore commodo officia cillum qui. Id excepteur aliqua eiusmod voluptate dolor laboris. Ex laboris deserunt laboris consectetur adipisicing mollit consequat reprehenderit amet eiusmod. Anim magna ut culpa aliquip ea commodo proident exercitation duis nulla. Nulla sunt officia aliquip est sit incididunt sint ad fugiat. Qui fugiat elit magna id duis culpa aute. Officia magna et id esse qui nisi sint eu nostrud ex exercitation anim sunt magna. - -Ullamco eu veniam nisi `aliqua`. Lorem nulla nostrud Lorem quis ex. Minim magna irure ex et. Cillum est incididunt consequat deserunt do enim adipisicing elit esse nostrud nisi exercitation. Excepteur fugiat et veniam sit. Ipsum in sit qui exercitation ut in Lorem in esse excepteur aliqua voluptate proident duis. - -== Sample Title 2 - -Optio ab voluptate impedit, iusto explicabo tempore? Ipsam eaque accusamus mollitia accusantium quod aperiam. Sit cum tempora quod! Placeat assumenda adipisci eius? - -Minim pariatur in aute nulla non ea commodo velit enim ad nostrud culpa. Occaecat laborum aute nostrud excepteur aliquip eiusmod irure est nisi ut. Deserunt mollit qui pariatur irure voluptate labore adipisicing. Lorem exercitation pariatur cupidatat minim do sit ea cillum. Esse duis cillum veniam Lorem cillum do nulla. Sint esse ((dolor)) veniam dolor non cillum id voluptate. Nulla irure incididunt cillum in incididunt dolore sit amet pariatur. - -[#random-ref] -Sint nisi do deserunt elit. Laboris qui eiusmod ut et dolore laboris dolore tempor consectetur aliqua aliqua quis culpa. Duis deserunt ea reprehenderit duis commodo consequat et ea tempor culpa laborum anim. Tempor pariatur aute labore consectetur. Ut laboris amet aliquip in fugiat laborum ex. - -Occaecat eu ex incididunt proident consectetur proident eiusmod fugiat veniam dolor voluptate adipisicing. Eiusmod ullamco pariatur adipisicing fugiat ipsum cillum ullamco. Reprehenderit eu do tempor et amet. Ex ea sint non nisi enim tempor consequat labore. - -=== Sample Title 3 - -Quisquam, vero facere voluptatem impedit optio fuga accusamus non dignissimos, exercitationem culpa error debitis, molestiae corporis? Repudiandae eum dolor quae nemo reiciendis. - -Labore consequat deserunt ea sint incididunt duis laborum sit et ex adipisicing tempor. Labore nulla fugiat officia est irure nisi. Amet sint excepteur quis deserunt commodo mollit amet aute est qui aute laboris cillum. Tempor magna dolore velit reprehenderit dolore. Excepteur fugiat ullamco tempor ea labore magna ea in deserunt nulla. Consectetur eiusmod ea sit sint nulla officia consectetur. Elit proident qui voluptate nulla occaecat consectetur ex ullamco. - -Velit Lorem deserunt pariatur ex tempor. Exercitation incididunt nostrud elit pariatur incididunt labore dolor in incididunt nisi. Aliquip est nulla esse id aliqua mollit sit sunt tempor et excepteur. Adipisicing sunt tempor non consectetur reprehenderit excepteur sint laboris. - -==== Sample Title 4 - -Sint reprehenderit sit veniam eu adipisicing nisi. Fugiat tempor cillum pariatur Lorem eu cupidatat. Reprehenderit proident deserunt ipsum cupidatat fugiat enim proident officia. Consequat ad laboris aute qui labore ullamco nisi proident occaecat cupidatat eiusmod. Ullamco irure eiusmod velit aliqua enim anim est incididunt irure laborum ex non enim. Do exercitation nostrud duis sint minim nulla dolor veniam. - -Exercitation cupidatat ipsum velit consequat exercitation Lorem et anim labore minim cupidatat duis commodo. Deserunt amet aliquip sunt laborum officia. Reprehenderit id excepteur consectetur tempor eiusmod eu. Lorem pariatur ut ipsum irure Lorem irure nulla fugiat in ad officia. Sunt esse in sit aliquip. - -Laboris commodo labore anim ea. Nostrud culpa Lorem enim labore esse qui enim incididunt sunt eiusmod cupidatat veniam enim irure. Culpa velit duis duis esse amet adipisicing fugiat dolore do minim exercitation. Nostrud magna id nostrud nostrud minim cupidatat. Sunt amet qui amet deserunt commodo Lorem. - -===== Sample title 5 - -Irure nisi laboris amet do sit Lorem do. Aliqua esse ex in dolore nulla. Aute deserunt nostrud eiusmod fugiat aliquip proident ad eiusmod incididunt est in nisi deserunt Lorem. - -====== Sample title 6 - -Et nisi fugiat in culpa id voluptate incididunt anim commodo. Irure non dolor velit irure non incididunt nisi laborum minim. Elit duis consectetur aliqua laborum tempor et nulla. Nulla dolore magna dolor occaecat velit magna sint nulla. Proident veniam officia in nisi cillum ut deserunt consequat mollit laborum. - -<> - -======= Sample title 7 - -Ullamco ipsum consequat consequat in pariatur ad tempor nisi minim deserunt sunt ex. Minim enim irure quis aliqua anim nisi amet aliquip labore excepteur nisi amet commodo mollit. Est dolor eu commodo Lorem cillum. Elit deserunt cillum excepteur proident aliquip sunt incididunt. Deserunt voluptate enim incididunt incididunt pariatur. - - -== Code - -.Subsets in a Set -[source, javascript] ----- -include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] ----- -<1> Base case is empty element. -<2> For each element from the input append it to the results array. -<3> The new results array will be what it was before + the duplicated with the appended element. - -//.The way this algorithm generates all subsets is: -//1. The base case is an empty element (line 13). E.g. [''] -//2. For each element from the input append it to the results array (line 16) -//3. The new results array will be what it was before + the duplicated with the appended element (line 17) - -== Side notes - -.JavaScript built-in `BigInt` -**** -BigInt allows to operate beyond the maximum safe limit of integers (Number.MAX_SAFE_INTEGER => 9,007,199,254,740,991). BigInt uses the suffix n, e.g. 1n + 3n === 4n. -**** - -== ((Emojis)) - -Money flying: -[big]#💸# - -Clockwatch: -[big]*⏱* - -Honey and Bee: -[big]*🍯🐝* - -Skull: -[big]#💀# - -Scream: -[big]#😱# - -Sunglasses and thumbs up -[big]#😎👍# - -Turtle -[big]#🐢# - -Rocket: -[big]#🚀# - -Mindblown: -[big]*🤯* - -THumbsdown -[big]#👎# - -- Space Complexity: [big]#⚠️# <> _O(n)_ -- <>: [big]#✅# Yes -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ - -.How to explain dynamic programming to kids? 👶 ----- -Lorem ipsum dolor sit amet consectetur adipisicing elit. Dignissimos commodi qui maxime fugiat at eveniet blanditiis adipisci ex autem, numquam quidem iusto! Ex illum cupiditate ratione vero, molestiae beatae laboriosam? test [big]*🤯* ----- - -== Images - -.CPU operations vs. Algorithm runtime as the input size grows -image:image5.png[CPU time needed vs. Algorithm runtime as the input size increases] - -== Quotes - -Lorem, ipsum ((dolor)) sit amet consectetur adipisicing elit. Perspiciatis doloremque fuga nobis tempora saepe sed iste quod quia blanditiis dolorem alias, accusantium quas nihil ullam assumenda nostrum similique ad itaque? - -[quote, H. J. Harrington] -Measurement is the first step that leads to control and eventually to improvement. If you can’t measure something, you can’t understand it. If you can’t understand it, you can’t control it. If you can’t manage it, you can’t improve it. - -== Tables - -.Time and Space Complexity of Linear Data Structures (Array, LinkedList, Stack & Queues) -|=== -.2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space Complexity -^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) -| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) -| Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) -|=== -{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. - -.Time complexity for a Graph data structure -|=== -.2+.^s| Data Structure 2+^s| Vertices 2+^s| Edges .2+^.^s| Space Complexity -^|_Add_ ^|_Remove_ ^|_Add_ ^|_Remove_ -| Graph (adj. matrix) ^| O(\|V\|^2^) ^| O(\|V\|^2^) ^|O(1) ^|O(1) ^|O(\|V\|^2^) -| Graph (adj. list w/array) ^| O(1) ^| O(\|V\| + \|E\|)) ^|O(1) ^|O(\|V\| + \|E\|) ^|O(\|V\| + \|E\|) -| Graph (adj. list w/HashSet) ^| O(1) ^| O(\|V\|)) ^|O(1) ^|O(\|V\|) ^|O(\|V\| + \|E\|) -|=== - - -.Most common algorithmic running times and their examples -[cols="2,2,5",options="header"] -|=== -|Big O Notation -|Name -|Example(s) - -|O(1) -|<> -|#<>, #<> - -|O(log n) -|<> -|<> - -|O(n) -|<> -|<> - -|O(n log n) -|<> -|<> - -|O(n^2^) -|<> -|<> - -|O(n^3^) -|<> -|<> - -|O(2^n^) -|<> -|<> - -|O(n!) -|<> -|<> -|=== - -== Admonitions - -The following admonitions are used to highlight content - -IMPORTANT: Reword essential concepts. Good for memorizing, tweeting and sharing. - -.Side Note with Title -[NOTE] -==== -Side notes. E.g. provide language specific: BigInt, charCodeAt... -[source,javascript] ----- -function a(test) { - return `${test}`; -} ----- -==== - -=== Legend - -==== Note - -NOTE: Lorem ipsum ((dolor)) sit amet, consectetur adipisicing elit. Odio laudantium et consequuntur, eveniet numquam voluptatibus molestias nostrum reprehenderit blanditiis enim asperiores consequatur dolore tempore laboriosam! At aliquam mollitia aspernatur magnam. - -==== Tip - -TIP: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id nesciunt quaerat sint provident beatae. Assumenda necessitatibus ea non illum ipsa eveniet! Odio, blanditiis debitis harum porro autem ut fugiat deserunt. - -==== Important - -IMPORTANT: Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi maiores aperiam quasi error facilis ducimus quis vero architecto soluta! Fuga alias aspernatur voluptate voluptas veniam maxime eligendi nemo neque excepturi. - - -==== Caution - -CAUTION: Lorem ipsum dolor sit amet consectetur adipisicing elit. Sed deserunt error alias quod, modi ex, repudiandae voluptatem atque saepe, vero eius vel numquam aperiam neque incidunt eum nobis earum nostrum. - -==== Warning - -WARNING: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque quam delectus consequatur omnis nostrum, minus consectetur animi quod adipisci, architecto similique quasi voluptatem voluptas repudiandae minima. Fuga incidunt maiores magnam! - -== HTML-only content (iframe) - -Later, in the 2nd part we are going to explore non-linear data structures like Graphs and Trees. -ifdef::backend-html5[] -If you want to have a general overview of each one, take a look at the following interactive diagram: -+++ - -+++ -endif::[] - - -== Graphviz Diagrams - -=== Graphviz with png - -[graphviz, dfs-graph, png] -.... -digraph G { - - node [fillcolor="#F8E71C" style=filled shape=circle] 0; - node [fillcolor="#F5A623"] 1; - node [fillcolor="#B8E986"] 2; - node [fillcolor="#BD10E0"] 3; - node [fillcolor="#50E3C2"] 4; - node [fillcolor="#4A90E2"] 5; - // node [fillcolor="#FF5252"] 6; - - 0 -> 5 - 0 -> 4 - 0 -> 1 - 1 -> 4 - 1 -> 3 - 2 -> 1 - 3 -> 4 - 3 -> 2 - - label="DFS" - - { rank=same; 3, 1 } - { rank=same; 0, 4 } - -} -.... - -=== Graphviz with svg -indexterm:[Fibonacci] - -[graphviz, Recursive Fibonacci call tree with dp (sample), svg] -.... -graph G { - "fib(5)" -- { "fib(4)" } - "fib(4)" -- { "fib(3)" } - "fib(3)" -- { "fib(2)" } - "fib(2)" -- { "fib(1)", "fib(0)" } -} -.... - -[graphviz, Words permutations (sample), svg] -.... -digraph g { - node [shape = record,height=.1]; - - art[label = " A| R| T"]; - art1[label = " A| R| T"]; - art2[label = " A| R| T", color="red"]; - atr[label = " A| T| R", color="red"]; - rat[label = " R| A| T"]; - rat1[label = " R| A| T", color="red"]; - rta[label = " R| T| A", color="red"]; - tra[label = " T| R| A"]; - tra1[label = " T| R| A", color="red"]; - tar[label = " T| A| R", color="red"]; - - "art":f0 -> "art1":f0 [ label = "1. swap A/A"]; - "art1":f0 -> "art2":f0 [ label = "2. swap R/R"]; - "art2":f2 -> "art1":f1 [ label = "3", color="grey"]; - "art1":f2 -> "atr":f0 [ label = "4. swap R/T"]; - "atr":f2 -> "art1":f2 [ label = "5", color="grey"]; - "art1":f1 -> "art":f0 [ label = "6", color="grey"]; - - "art":f1 -> "rat":f0 [ label = "7. swap A/R"]; - "rat":f0 -> "rat1":f0 [ label = "8. swap A/A"]; - "rat1":f2 -> "rat":f1 [ label = "9", color="grey"]; - "rat":f2 -> "rta":f0 [ label = "10. swap A/T"]; - - "art":f2 -> "tra":f0 [ label = "swap A/T"]; - "tra":f0 -> "tra1":f0 [ label = "swap R/R"]; - "tra":f2 -> "tar":f0 [ label = "swap R/A"]; - -} -.... - - - -// ------------------ - -:leveloffset: -1 - - -[[chapter-2]] -= Section 2 - -== Another sample - -[.lead] -Id excepteur sit duis ut ad nulla commodo elit consectetur est enim. Consectetur duis fugiat eu aute id cupidatat ullamco. Ad duis non consectetur aliqua nulla nostrud. - -Quis aute et consectetur ad pariatur ea commodo amet cupidatat velit ullamco. Cupidatat enim enim non est reprehenderit exercitation ut excepteur amet consectetur. Mollit quis ipsum eu adipisicing ipsum magna. - -Cupidatat sit aute et minim do. Non est anim fugiat proident ex enim voluptate non et consectetur. Culpa proident deserunt ipsum irure reprehenderit voluptate irure tempor tempor proident. Quis ipsum eiusmod tempor et reprehenderit non adipisicing. Consectetur dolore ullamco adipisicing ad adipisicing aliqua eu. Eu excepteur ipsum magna aliqua cillum in sint sint id exercitation est. Enim occaecat ut aute elit. - -Eiusmod excepteur eiusmod ((dolor)) magna nulla pariatur exercitation ex. Laborum sunt quis dolor qui do magna. Non velit reprehenderit minim duis est dolor commodo irure fugiat. Velit culpa laboris mollit esse minim sit id incididunt minim duis excepteur eiusmod ullamco. Pariatur pariatur ut laboris aute velit id nulla reprehenderit. - -Officia sint sit Lorem eu officia sint ad et et do. Deserunt nulla exercitation aute nulla enim laboris aliquip nulla. Commodo laboris amet enim veniam cupidatat culpa culpa duis deserunt esse ipsum. Deserunt nisi qui ullamco deserunt pariatur nisi velit tempor fugiat et pariatur do deserunt cillum. Dolore officia occaecat eiusmod occaecat reprehenderit cillum laboris irure irure ad tempor fugiat amet Lorem. Qui dolor elit ipsum consectetur commodo amet mollit eiusmod ex officia. Sit enim sunt nisi consectetur sint est id. - -Eu sint labore esse labore amet magna commodo exercitation labore. Esse aliquip dolor consequat exercitation ut amet labore esse velit. Et veniam ullamco aute laboris nulla exercitation qui aliqua eu. Ea cupidatat cupidatat non quis irure amet in minim laboris mollit. Enim eu pariatur et magna voluptate. diff --git a/book/chapters/sorting-intro.adoc b/book/chapters/sorting-intro.adoc deleted file mode 100644 index eaa4a9ef..00000000 --- a/book/chapters/sorting-intro.adoc +++ /dev/null @@ -1,20 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Sorting Algorithms - -Sorting is one of the most common solutions when we want to extract some insights about a collection of data. -We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. - -.We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: -- <> -- <> -- <> - -.and then discuss efficient sorting algorithms _O(n log n)_ such as: -- <> -- <> - -Before we dive into the most well-known sorting algorithms, let's discuss the sorting properties. diff --git a/book/chapters/sorting-properties.adoc b/book/chapters/sorting-properties.adoc deleted file mode 100644 index 7b1209e6..00000000 --- a/book/chapters/sorting-properties.adoc +++ /dev/null @@ -1,78 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Sorting Properties - -Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. - -Sorting properties are stable, adaptive, online and in-place. Let's go one by one. - -== Stable -(((Sorting, stable))) -An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. - -This especially useful when you want to sort on multiple phases. - -.Let's say you have the following data: -[source, javascript] ----- -const users = [ - { name: 'Bob', age: 32 }, - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Charly', age: 32 }, -]; ----- - -.If you sort by `name` you would have: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, - { name: 'Don', age: 30 }, -]; ----- - -Then, here comes the _critical_ part, if you sort by `age` you might get (at least two) different results. - -.If the sorting algorithm is *stable*; it should keep the items with the same age ordered by `name`: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, -]; ----- - -.However, if the sorting is *not stable*, then you will lose the relative order of the items and get something like this: -[source, javascript] ----- -[ - { name: 'Don', age: 30 }, - { name: 'Alice', age: 30 }, - { name: 'Charly', age: 32 }, - { name: 'Bob', age: 32 }, -]; ----- - -Both results are sorted by `age`; however, having a stable sorting is better if you want to keep the relative position of data with the same value. - -== In-place -(((Sorting, in-place))) -An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. -No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. - -== Online -(((Sorting, online))) -It can sort a list as it receives it. -((Online sorting)) algorithms don't have to re-sort the whole collection for every new item added. - -== Adaptive -(((Sorting, adaptive))) -Algorithms with ((adaptive sorting)) run faster, close to _O(n)_, on an already sorted (or partially sorted) collection. diff --git a/book/chapters/sorting-summary.adoc b/book/chapters/sorting-summary.adoc deleted file mode 100644 index 5c0414e3..00000000 --- a/book/chapters/sorting-summary.adoc +++ /dev/null @@ -1,35 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Summary - -We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. -(((Tables, Algorithms, Sorting Complexities))) -(((Tables, Algorithms, Sorting Summary))) - -// tag::table[] -.Sorting algorithms comparison -[cols="20,80"] -|=== -| Algorithms | Comments -| <> | Swap pairs bubbling up largest numbers to the right -| <> | Look for biggest number to the left and swap it with current -| <> | Iterate array looking for smallest value to the right -| <> | Split numbers in pairs, sort pairs and join them in ascending order -| <> | Choose a pivot, set smaller values to the left and bigger to the right. -// | Tim sort | Hybrid of merge sort and insertion sort -|=== - -.Sorting algorithms time/space complexity and properties -|=== -| Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No -| <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No -| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No -// | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes -|=== -// end::table[] diff --git a/book/chapters/timsort.adoc b/book/chapters/timsort.adoc deleted file mode 100644 index f2c5c29f..00000000 --- a/book/chapters/timsort.adoc +++ /dev/null @@ -1,63 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Tim Sort - -tim sort is an efficient recursive sorting algorithm that uses "divide and conquer" paradigm to sort faster. It can be implemented in-place so it doesn't require additonal memory. -indexterm:[Divide and Conquer] - -In practice timsort outperforms efficient sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. - -tim sort basically picks a "pivot" element (preferably random) and move all the elements that are smaller than the pivot to the right and the ones that are bigger to the left. It does this recursively until all the array is sorted. - -== tim Sort Implementation - -tim sort implementation uses the divide-and-conquer in the following way: - -.tim Sort Algorithm -. Pick a "pivot" element (at random) -. Move everything that is lower than the pivot to the left and everything that is bigger than the pivot to the right. -. Recursively repeat step 1 and 2, the sub-arrays on the left and on the right WITHOUT including the pivot. - -Let's convert these words into code! - -.tim Sort implementation in JavaScript (timSort) -[source, javascript] ----- -include::{codedir}/algorithms/sorting/tim-sort.js[tag=timSort, indent=0] ----- -<1> Partition: picks a pivot and find the index where the pivot will be when the array is sorted. -<2> Do the partition of the sub-array at the left of the pivot. -<3> Do the partition of the sub-array at the right of the pivot. -<4> Only do the partition when there's something to divide. - -The real heavy-lifting is don in the partion function. Let's implement that: - -.tim Sort implementation in JavaScript (partition) -[source, javascript] ----- -include::{codedir}/algorithms/sorting/tim-sort.js[tag=partition, indent=0] ----- -<1> Make the rightmost element as the pivot. -<2> This is the place holder for the final pivot index. We start in low and as we move all the lower elements to the left we will get the final place where the pivot should be. -<3> Move one element at a time comparing it to the pivot value. -<4> If the current element value is less than the pivot, then increment pivot index (pivot should be place after all the lower values). We also swap the value before incrementing because current element that is lower than the pivot to be at its left side. - -Merge sort has a _O(n log n)_ running time. For more details about the how to extract the runtime go to <>. - -== tim Sort Properties - -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#⚠️# <> _O(n)_ -- <>: [big]#✅# Yes -- <>: [big]#✅# Yes -- <>: [big]#️️️️️️️⛔️️️️️# No, mostly sorted array takes the same time O(n log n). -- <>: [big]#️️️️️️️⛔️️️️️# No, the pivot element can be choose at random. -- Recursive: Yes - - -// Resources: -// https://twitter.com/mathias/status/1036626116654637057?lang=en -// http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/src/share/classes/java/util/TimSort.java diff --git a/book/chapters/trie.adoc b/book/chapters/trie.adoc deleted file mode 100644 index 6c310e76..00000000 --- a/book/chapters/trie.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Trie - -Aute ad cupidatat cillum enim deserunt. Reprehenderit eiusmod non do eiusmod duis culpa ipsum consequat tempor magna elit. Fugiat est eu proident incididunt adipisicing. Enim tempor aute ad quis officia enim enim pariatur do commodo labore sunt minim. diff --git a/book/config b/book/config index ca372d2e..32d0d63b 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit ca372d2e9e00db369453488216c2dd2c081865d3 +Subproject commit 32d0d63bf236990c3201c3e53ca357718ba6b9a8 diff --git a/book/chapters/colophon.adoc b/book/content/colophon.asc similarity index 87% rename from book/chapters/colophon.adoc rename to book/content/colophon.asc index 5be4908a..c6860171 100644 --- a/book/chapters/colophon.adoc +++ b/book/content/colophon.asc @@ -1,5 +1,5 @@ [colophon#colophon%nonfacing] -= {doctitle} +== Data Structures & Algorithms in JavaScript Copyright © {docyear} Adrian Mejia @@ -11,4 +11,5 @@ No part of this publication may be produced, store in a retrieval system, or tra While every precaution has been taking in the preparation of this book, the publisher and author assume no responsibility for errors or omissions, or damages resulting from the use of the information contained herein. -{revremark}, {revdate}. +// {revremark}, {revdate}. +Version {revnumber}, {revdate}. diff --git a/book/content/cover.png b/book/content/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..f0194209615492ce20c67d80ec6a4b371b195758 GIT binary patch literal 114081 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 CDZHfs literal 0 HcmV?d00001 diff --git a/book/content/dedication.asc b/book/content/dedication.asc new file mode 100644 index 00000000..2d833fbf --- /dev/null +++ b/book/content/dedication.asc @@ -0,0 +1,4 @@ +[dedication] +== Dedication + +_To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail._ diff --git a/book/content/introduction.asc b/book/content/introduction.asc new file mode 100644 index 00000000..cec2cb11 --- /dev/null +++ b/book/content/introduction.asc @@ -0,0 +1,59 @@ +[preface] +== Introduction + +You are about to become a better programmer and grasp the fundamentals of Algorithms and Data Structures. +Let's take a moment to explain how are we going to do that. + +This book is divided in 4 main parts.... + +In *Chapter 1*, we're going to cover Version Control Systems (VCSs) and Git basics -- no technical stuff, just what Git is, why it came about in a land full of VCSs, what sets it apart, and why so many people are using it. +Then, we'll explain how to download Git and set it up for the first time if you don't already have it on your system. + +In *Chapter 2*, we will go over basic Git usage -- how to use Git in the 80% of cases you'll encounter most often. +After reading this chapter, you should be able to clone a repository, see what has happened in the history of the project, modify files, and contribute changes. +If the book spontaneously combusts at this point, you should already be pretty useful wielding Git in the time it takes you to go pick up another copy. + +*Chapter 3* is about the branching model in Git, often described as Git's killer feature. +Here you'll learn what truly sets Git apart from the pack. +When you're done, you may feel the need to spend a quiet moment pondering how you lived before Git branching was part of your life. + +*Chapter 4* will cover Git on the server. +This chapter is for those of you who want to set up Git inside your organization or on your own personal server for collaboration. +We will also explore various hosted options if you prefer to let someone else handle that for you. + +*Chapter 5* will go over in full detail various distributed workflows and how to accomplish them with Git. +When you are done with this chapter, you should be able to work expertly with multiple remote repositories, use Git over email and deftly juggle numerous remote branches and contributed patches. + +*Chapter 6* covers the GitHub hosting service and tooling in depth. +We cover signing up for and managing an account, creating and using Git repositories, common workflows to contribute to projects and to accept contributions to yours, GitHub's programmatic interface and lots of little tips to make your life easier in general. + +*Chapter 7* is about advanced Git commands. +Here you will learn about topics like mastering the scary 'reset' command, using binary search to identify bugs, editing history, revision selection in detail, and a lot more. +This chapter will round out your knowledge of Git so that you are truly a master. + +*Chapter 8* is about configuring your custom Git environment. +This includes setting up hook scripts to enforce or encourage customized policies and using environment configuration settings so you can work the way you want to. +We will also cover building your own set of scripts to enforce a custom committing policy. + +*Chapter 9* deals with Git and other VCSs. +This includes using Git in a Subversion (SVN) world and converting projects from other VCSs to Git. +A lot of organizations still use SVN and are not about to change, but by this point you'll have learned the incredible power of Git -- and this chapter shows you how to cope if you still have to use a SVN server. +We also cover how to import projects from several different systems in case you do convince everyone to make the plunge. + +*Chapter 10* delves into the murky yet beautiful depths of Git internals. +Now that you know all about Git and can wield it with power and grace, you can move on to discuss how Git stores its objects, +what the object model is, details of packfiles, server protocols, and more. +Throughout the book, we will refer to sections of this chapter in case you feel like diving deep at that point; but if you are like us and want to dive into the technical details, you may want to read Chapter 10 first. +We leave that up to you. + +In *Appendix A*, we look at a number of examples of using Git in various specific environments. +We cover a number of different GUIs and IDE programming environments that you may want to use Git in and what is available for you. +If you're interested in an overview of using Git in your shell, your IDE, or your text editor, take a look here. + +In *Appendix B*, we explore scripting and extending Git through tools like libgit2 and JGit. +If you're interested in writing complex and fast custom tools and need low-level Git access, this is where you can see what that landscape looks like. + +Finally, in *Appendix C*, we go through all the major Git commands one at a time and review where in the book we covered them and what we did with them. +If you want to know where in the book we used any specific Git command you can look that up here. + +Let's get started. diff --git a/book/chapters/algorithms-analysis.adoc b/book/content/part01/algorithms-analysis.asc similarity index 90% rename from book/chapters/algorithms-analysis.adoc rename to book/content/part01/algorithms-analysis.asc index 38361721..fab397fe 100644 --- a/book/chapters/algorithms-analysis.adoc +++ b/book/content/part01/algorithms-analysis.asc @@ -1,16 +1,16 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Fundamentals of Algorithms Analysis +=== Fundamentals of Algorithms Analysis Probably you are reading this book because you want to write better and faster code. How can you do that? Can you time how long it takes to run a program? Of course, you can! [big]#⏱# However, if you run the same program on a smartwatch, cellphone or desktop computer, it will take different times. -image:image3.png[image,width=528,height=137] +image::image3.png[image,width=528,height=137] Wouldn't it be great if we can compare algorithms regardless of the hardware where we run them? That's what *time complexity* is for! @@ -24,7 +24,7 @@ We could also compare the memory "used" by different algorithms, and we called t Before going deeper into space and time complexity, let's cover the basics real quick. -== What are Algorithms? +==== What are Algorithms? Algorithms (as you might know) are steps of how to do some tasks. When you cook, you follow a recipe (or an algorithm) to prepare a dish. Let's say you want to make a pizza. @@ -47,7 +47,7 @@ If you play a game, you are devising strategies (or algorithms) to help you win. TIP: Algorithms are instructions on how to perform a task. -== Comparing Algorithms +==== Comparing Algorithms (((Comparing Algorithms))) Not all algorithms are created equal. There are “good” and “bad” algorithms. The good ones are fast; the bad ones are slow. Slow algorithms cost more money to run. Inefficient algorithms could make some calculations impossible in our lifespan! @@ -65,18 +65,18 @@ To give you a clearer picture of how different algorithms perform as the input s |Find all permutations of a string |4 sec. |> vigintillion years |> centillion years |∞ |∞ |============================================================================================= -Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. +Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. -From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. +From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. Organizing 1 million elements with merge sort takes 20 seconds while bubble sort takes 12 days, ouch! The amazing thing is that both programs are solving the same problem with equal data and hardware; and yet, there's a big difference in time! After completing this book, you are going to _think algorithmically_. You will be able to scale your programs while you are designing them. -Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# +Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# <<< -== Increasing your code performance +==== Increasing your code performance The first step to improve your code performance is to measure it. As somebody said: @@ -86,14 +86,14 @@ Measurement is the first step that leads to control and eventually to improvemen In this section, we are going to learn the basics of measuring our current code performance and compare it with other algorithms. -=== Calculating Time Complexity +===== Calculating Time Complexity (((Time complexity))) Time complexity, in computer science, is a function that describes the number of operations a program will execute given the size of the input `n`. How do you get a function that gives you the number of operations that will be executed? Well, we count line by line and mind code inside loops. Let's do an example to explain this point. For instance, we have a function to find the minimum value on an array called `getMin`. .Translating lines of code to an approximate number of operations -image:image4.png[Operations per line] +image::image4.png[Operations per line] Assuming that each line of code is an operation, we get the following: @@ -103,13 +103,13 @@ _3n + 3_ That means that if you have an array of 3 elements e.g. `getMin([3, 2, 9])`, then it will execute around _3(3)+3 = 12_ operations. Of course, this is not for every case. For instance, Line 12 is only executed if the condition on line 11 is met. As you might learn in the next section, we want to get the big picture and get rid of smaller terms to compare algorithms easier. -== Space Complexity +==== Space Complexity (((Space Complexity))) Space complexity is similar to time complexity. However, instead of the count of operations executed, it will account for the amount of memory used additionally to the input. For calculating the *space complexity* we keep track of the “variables” and memory used. In the `getMin` example, we just create a single variable called `min`. So, the space complexity is 1. On other algorithms, If we have to use an auxiliary array, then the space complexity would be `n`. -=== Simplifying Complexity with Asymptotic Analysis +===== Simplifying Complexity with Asymptotic Analysis (((Asymptotic Analysis))) When we are comparing algorithms, we don't want to have complex expressions. What would you prefer comparing two algorithms like "3n^2^ + 7n" vs. "1000 n + 2000" or compare them as "n^2^ vs. n"? Well, that when the asymptotic analysis comes to the rescue. @@ -129,7 +129,7 @@ In the previous example, we analyzed `getMin` with an array of size 3; what happ As the input size `n` grows bigger and bigger then the expression _3n + 3_ is closer and closer to _3n_. Dropping terms might look like a stretch at first, but you will see that what matters the most is the higher order terms of the function rather than lesser terms and constants. -=== What is Big O Notation? +===== What is Big O Notation? (((Big O))) There’s a notation called *Big O*, where `O` refers to the *order of the function*. @@ -176,7 +176,7 @@ This just an illustration since in different hardware the times will be slightly NOTE: These times are under the assumption of running on 1 GHz CPU and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. Regardless, bad algorithms would perform poorly even on a supercomputer. -== Summary +==== Summary In this chapter, we learned how you could measure your algorithm performance using time complexity. Rather than timing how long your program takes to run you can approximate the number of operations it will perform based on the input size. diff --git a/book/chapters/big-o-examples.adoc b/book/content/part01/big-o-examples.asc similarity index 82% rename from book/chapters/big-o-examples.adoc rename to book/content/part01/big-o-examples.asc index 171553b1..38cb3ba5 100644 --- a/book/chapters/big-o-examples.adoc +++ b/book/content/part01/big-o-examples.asc @@ -1,14 +1,13 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Big O examples -// = Eight Running Times You Should Know +=== Big O examples There are many kinds of algorithms. Most of them fall into one of the eight of the time complexities that we are going to explore in this chapter. -.Most common time complexities +.Eight Running Time complexity You Should Know - Constant time: _O(1)_ - Logarithmic time: _O(log n)_ - Linear time: _O(n)_ @@ -23,17 +22,18 @@ We a going to provide examples for each one of them. Before we dive in, here’s a plot with all of them. .CPU operations vs. Algorithm runtime as the input size grows -image:image5.png[CPU time needed vs. Algorithm runtime as the input size increases] +image::image5.png[CPU time needed vs. Algorithm runtime as the input size increases] The above chart shows how the running time of an algorithm is related to the amount of work the CPU has to perform. As you can see O(1) and O(log n) are very scalable. However, O(n^2^) and worst can make your computer run for years [big]#😵# on large datasets. We are going to give some examples so you can identify each one. -== Constant +[[constant]] +==== Constant (((Constant))) (((Runtime, Constant))) Represented as *O(1)*, it means that regardless of the input size the number of operations executed is always the same. Let’s see an example. [#constant-example] -=== Finding if an array is empty +===== Finding if an array is empty Let's implement a function that finds out if an array is empty or not. @@ -45,18 +45,19 @@ Let's implement a function that finds out if an array is empty or not. include::{codedir}/runtimes/01-is-empty.js[tag=isEmpty] ---- -Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. +Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performance than this! -== Logarithmic +[[logarithmic]] +==== Logarithmic (((Logarithmic))) (((Runtime, Logarithmic))) Represented in Big O notation as *O(log n)*, when an algorithm has this running time it means that as the size of the input grows the number of operations grows very slowly. Logarithmic algorithms are very scalable. One example is the *binary search*. indexterm:[Runtime, Logarithmic] -[#logarithmic-example] -=== Searching on a sorted array +[[logarithmic-example]] +===== Searching on a sorted array The binary search only works for sorted lists. It starts searching for an element on the middle of the array and then it moves to the right or left depending if the value you are looking for is bigger or smaller. @@ -71,13 +72,14 @@ This binary search implementation is a recursive algorithm, which means that the Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. -== Linear +[[linear]] +==== Linear (((Linear))) (((Runtime, Linear))) Linear algorithms are one of the most common runtimes. It’s represented as *O(n)*. Usually, an algorithm has a linear running time when it iterates over all the elements in the input. -[#linear-example] -=== Finding duplicates in an array using a map +[[linear-example]] +===== Finding duplicates in an array using a map Let’s say that we want to find duplicate elements in an array. What’s the first implementation that comes to mind? Check out this implementation: @@ -97,13 +99,14 @@ As we learned before, the big O cares about the worst-case scenario, where we wo Space complexity is also *O(n)* since we are using an auxiliary data structure. We have a map that in the worst case (no duplicates) it will hold every word. -== Linearithmic +[[linearithmic]] +==== Linearithmic (((Linearithmic))) (((Runtime, Linearithmic))) An algorithm with a linearithmic runtime is represented as _O(n log n)_. This one is important because it is the best runtime for sorting! Let’s see the merge-sort. -[#linearithmic-example] -=== Sorting elements in an array +[[linearithmic-example]] +===== Sorting elements in an array The ((Merge Sort)), like its name indicates, has two functions merge and sort. Let’s start with the sort function: @@ -129,21 +132,22 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge] The merge function combines two sorted arrays in ascending order. Let’s say that we want to sort the array `[9, 2, 5, 1, 7, 6]`. In the following illustration, you can see what each function does. .Mergesort visualization. Shows the split, sort and merge steps -image:image11.png[Mergesort visualization,width=500,height=600] +image::image11.png[Mergesort visualization,width=500,height=600] How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work we have *O(n log n)*. There more formal ways to reach to this runtime like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. -== Quadratic +[[quadratic]] +==== Quadratic (((Quadratic))) (((Runtime, Quadratic))) Running times that are quadratic, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. Usually, they have double-nested loops that where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. -[#quadratic-example] -=== Finding duplicates in an array (naïve approach) +[[quadratic-example]] +===== Finding duplicates in an array (naïve approach) -If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: +If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: // image:image12.png[image,width=527,height=389] @@ -155,15 +159,16 @@ include::{codedir}/runtimes/05-has-duplicates-naive.js[tag=hasDuplicates] As you can see, we have two nested loops causing the running time to be quadratic. How much different is a linear vs. quadratic algorithm? -Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# +Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# -== Cubic +[[cubic]] +==== Cubic (((Cubic))) (((Runtime, Cubic))) Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. As an example of a cubic algorithm is a multi-variable equation solver (using brute force): -[#cubic-example] -=== Solving a multi-variable equation +[[cubic-example]] +===== Solving a multi-variable equation Let’s say we want to find the solution for this multi-variable equation: @@ -183,15 +188,16 @@ WARNING: This just an example, there are better ways to solve multi-variable equ As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we can refer as a *polynomial runtime*. -== Exponential +[[exponential]] +==== Exponential (((Exponential))) (((Runtime, Exponential))) Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish on your lifetime. [big]#💀# Let’s do an example. -[#exponential-example] -=== Finding subsets of a set +[[exponential-example]] +===== Finding subsets of a set Finding all distinct subsets of a given set can be implemented as follows: @@ -213,7 +219,8 @@ include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] Every time the input grows by one the resulting array doubles. That’s why it has an *O(2^n^)*. -== Factorial +[[factorial]] +==== Factorial (((Factorial))) (((Runtime, Factorial))) Factorial runtime, O(n!), is not scalable at all. Even with input sizes of ~10 elements, it will take a couple of seconds to compute. It’s that slow! [big]*🍯🐝* @@ -229,8 +236,8 @@ A factorial is the multiplication of all the numbers less than itself down to 1. - 11! = 39,916,800 **** -[#factorial-example] -=== Getting all permutations of a word +[[factorial-example]] +===== Getting all permutations of a word (((Permutations))) (((Words permutations))) One classic example of an _O(n!)_ algorithm is finding all the different words that can be formed with a given set of letters. @@ -247,7 +254,7 @@ As you can see in the `getPermutations` function, the resulting array is the fac Factorial start very slow and then it quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! [big]*🤯* -== Summary +==== Summary We went through 8 of the most common time complexities and provided examples for each of them. Hopefully, this will give you a toolbox to analyze algorithms. (((Tables, Intro, Common time complexities and examples))) @@ -261,35 +268,35 @@ We went through 8 of the most common time complexities and provided examples for |Example(s) |O(1) -|<> -|<> +|<> +|<> |O(log n) -|<> -|<> +|<> +|<> |O(n) -|<> -|<> +|<> +|<> |O(n log n) -|<> -|<> +|<> +|<> |O(n^2^) -|<> -|<> +|<> +|<> |O(n^3^) -|<> -|<> +|<> +|<> |O(2^n^) -|<> -|<> +|<> +|<> |O(n!) -|<> -|<> +|<> +|<> |=== // end::table[] diff --git a/book/chapters/linear-data-structures-outro.adoc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc similarity index 57% rename from book/chapters/linear-data-structures-outro.adoc rename to book/content/part02/array-vs-list-vs-queue-vs-stack.asc index dc0a0696..127ce33b 100644 --- a/book/chapters/linear-data-structures-outro.adoc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -1,4 +1,9 @@ -= Array vs. Linked List & Queue vs. Stack +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Array vs. Linked List & Queue vs. Stack In this part of the book, we explored the most used linear data structures such as Arrays, Linked Lists, Stacks and Queues. We implemented them and discussed the runtime of their operations. @@ -13,23 +18,24 @@ In this part of the book, we explored the most used linear data structures such .Use a Queue when: * You need to access your data in a first-come, first served basis (FIFO). -* You need to implement a <> +* You need to implement a <> .Use a Stack when: * You need to access your data as last-in, first-out (LIFO). -* You need to implement a <> +* You need to implement a <> (((Tables, Linear DS, Array/Lists/Stack/Queue complexities))) +[[linear-data-structures-table]] // tag::table[] .Time/Space Complexity of Linear Data Structures (Array, LinkedList, Stack & Queues) |=== .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) -| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) +| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) | Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) |=== // end::table[] diff --git a/book/chapters/array.adoc b/book/content/part02/array.asc similarity index 94% rename from book/chapters/array.adoc rename to book/content/part02/array.asc index 4d89ddda..41bd6ef3 100644 --- a/book/chapters/array.adoc +++ b/book/content/part02/array.asc @@ -1,14 +1,15 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Array +[[array]] +=== Array (((Array))) (((Data Structures, Linear, Array))) Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. -== Array Basics +==== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. @@ -22,11 +23,11 @@ Some programming languages have fixed size arrays like Java and C++. Fixed size Arrays look like this: .Array representation: each value is accessed through an index. -image:image16.png[image,width=388,height=110] +image::image16.png[image,width=388,height=110] Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. -== Insertion +==== Insertion Arrays are built-in into most languages. Inserting an element is simple; you can either add them on creation time or after initialization. Below you can find an example for both cases: @@ -54,7 +55,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] The runtime for inserting elements using index is always is constant: _O(1)_. -=== Inserting at the beginning of the array +===== Inserting at the beginning of the array What if you want to insert a new element at the beginning of the array? You would have to push every item to the right. @@ -75,7 +76,7 @@ The `unshift()` method adds one or more elements to the beginning of an array an Runtime: O(n). **** -=== Inserting at the middle of the array +===== Inserting at the middle of the array Inserting a new element in the middle involves moving part of the array but not all of the items. @@ -97,7 +98,7 @@ The `splice()` method changes the contents of an array by removing existing elem Runtime: O(n). **** -=== Inserting at the end of the array +===== Inserting at the end of the array We can push new values to the end of the array like this: @@ -119,7 +120,8 @@ The `push()` method adds one or more elements to the end of an array and returns Runtime: O(1). **** -== Searching by value and index +[[array-search-by-value]] +==== Searching by value and index Searching by index is very easy using the `[]` operator: @@ -180,11 +182,11 @@ function searchByValue(array, value) { We would have to loop through the whole array (worst case) or until we find it: *O(n)*. -== Deletion +==== Deletion Deleting (similar to insertion) there are three possible scenarios, removing at the beginning, middle or end. -=== Deleting element from the beginning +===== Deleting element from the beginning Deleting from the beginning can be done using the `splice` function and also the `shift`. For simplicity, we will use the latter. @@ -207,7 +209,7 @@ The `shift()` method shift all elements to the left. In turn, it removes the fir Runtime: O(n). **** -=== Deleting element from the middle +===== Deleting element from the middle We can use the `splice` method for deleting an item from the middle of an array. @@ -223,7 +225,7 @@ array.splice(2, 1); // ↪️[2] <1> Deleting from the middle might cause most the elements of the array to move back one position to fill in for the eliminated item. Thus, runtime: O(n). -=== Deleting element from the end +===== Deleting element from the end Removing the last element is very straightforward: @@ -244,7 +246,7 @@ The `pop()` method removes the last element from an array and returns that eleme Runtime: O(1). **** -== Array Complexity +==== Array Complexity To sum up, the time complexity of an array is: (((Tables, Linear DS, Array Complexities))) diff --git a/book/chapters/linked-list.adoc b/book/content/part02/linked-list.asc similarity index 89% rename from book/chapters/linked-list.adoc rename to book/content/part02/linked-list.asc index 50f103cf..f253ac34 100644 --- a/book/chapters/linked-list.adoc +++ b/book/content/part02/linked-list.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Linked List +[[linked-list]] +=== Linked List (((Linked List))) (((List))) (((Data Structures, Linear, Linked List))) @@ -14,22 +15,23 @@ A list (or Linked List) is a linear data structure where each node is "linked" t - Doubly: every node has a reference to the next and previous object - Circular: the last element points to the first one. - -== Singly Linked List +[[singly-linked-list]] +==== Singly Linked List Each element or node is *connected* to the next one by a reference. When a node only has one connection it's called *singly linked list*: .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. -image:image19.png[image,width=498,height=97] +image::image19.png[image,width=498,height=97] Usually, a Linked List is referenced by the first element in called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. -== Doubly Linked List +[[doubly-linked-list]] +==== Doubly Linked List When each node has a connection to the `next` item and also the `previous` one, then we have a *doubly linked list*. .Doubly Linked List: each node has a reference to the next and previous element. -image:image20.png[image,width=528,height=74] +image::image20.png[image,width=528,height=74] With a doubly list you can not only move forward but also backward. If you keep the reference to the last element (`cat`) you can step back and reach the middle part. @@ -43,7 +45,7 @@ If we implement the code for the `Node` elements, it would be something like thi include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ---- -== Linked List vs. Array +==== Linked List vs. Array Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t always an array more efficient with _O(1)_ access time? It depends. @@ -53,7 +55,7 @@ Another difference is that adding/deleting at the beginning on an array takes O( A drawback of a linked list is that if you want to insert/delete an element at the end of the list, you would have to navigate the whole collection to find the last one O(n). However, this can be solved by keeping track of the last element in the list. We are going to implement that! -== Implementing a Linked List +==== Implementing a Linked List We are going to implement a doubly linked list. First, let's start with the constructor. @@ -70,7 +72,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. -== Searching by value +==== Searching by value Finding an element by value there’s no other way than iterating through the whole list. @@ -97,7 +99,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent= We are going to use this `find` method again to implement searching by index. -== Searching by index +==== Searching by index Searching by index is very similar, we iterate through the list until we find the element that matches the position. @@ -109,22 +111,21 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. -== Insertion +==== Insertion Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. -=== Inserting elements at the beginning of the list +[[linked-list-inserting-beginning]] +===== Inserting elements at the beginning of the list We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. .Insert at the beginning by linking the new node with the current first node. -image:image23.png[image,width=498,height=217] +image::image23.png[image,width=498,height=217] To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: -[#linked-list-inserting-beginning] - .Add item to the beginning of a Linked List [source, javascript] ---- @@ -134,12 +135,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addFirst, ind As you can see, we create a new node and make it the first one. -=== Inserting element at the end of the list +===== Inserting element at the end of the list Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list -image:image24.png[image,width=498,height=208] +image::image24.png[image,width=498,height=208] .Linked List's add to the end of the list implementation [source, javascript] @@ -150,7 +151,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, inde If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. -=== Inserting element at the middle of the list +===== Inserting element at the middle of the list For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. @@ -170,7 +171,7 @@ art <-> dog <-> cat We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. -image:image25.png[image,width=528,height=358] +image::image25.png[image,width=528,height=358] Take a look into the implementation of https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js#L83[LinkedList.add]: @@ -189,16 +190,16 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, in Take notice that we reused, `addFirst` and `addLast` methods. For all the other cases the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting on the middle takes *O(n)* because we have to iterate through the list using the `get` method. -== Deletion +==== Deletion Deleting is an interesting one. We don’t delete an element; we remove all references to that node. Let’s go case by case to explore what happens. -=== Deleting element from the head +===== Deleting element from the head Deleting the first element (or head) is a matter of removing all references to it. .Deleting an element from the head of the list -image:image26.png[image,width=528,height=74] +image::image26.png[image,width=528,height=74] For instance, to remove the head (“art”) node, we change the variable `first` to point to the second node “dog”. We also remove the variable `previous` from the "dog" node, so it doesn't point to the “art” node. The garbage collector will get rid of the “art” node when it seems nothing is using it anymore. @@ -210,12 +211,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeFirst, As you can see, when we want to remove the first node we make the 2nd element the first one. -=== Deleting element from the tail +===== Deleting element from the tail Removing the last element from the list would require to iterate from the head until we find the last one, that’s O(n). But, If we have a reference to the last element, which we do, We can do it in _O(1)_ instead! .Removing last element from the list using the last reference. -image:image27.png[image,width=528,height=221] +image::image27.png[image,width=528,height=221] For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat” then is out of the list and eventually is deleted from memory by the garbage collector. @@ -229,12 +230,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. -=== Deleting element from the middle +===== Deleting element from the middle To remove a node from the middle, we make the surrounding nodes to bypass the one we want to delete. .Remove the middle node -image:image28.png[image,width=528,height=259] +image::image28.png[image,width=528,height=259] In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art” totally bypassing “dog”. @@ -249,7 +250,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeByPosit Notice that we are using the `get` method to get the node at the current position. That method loops through the list until it found the node at the specified location. This iteration has a runtime of _O(n)_. -== Linked List Complexity vs. Array Complexity +==== Linked List Complexity vs. Array Complexity So far, we have seen two liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) @@ -278,9 +279,9 @@ Use arrays when: Use a doubly linked list when: -* You want to access elements in a *sequential* manner only like <> or <>. +* You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). * You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. diff --git a/book/chapters/queue.adoc b/book/content/part02/queue.asc similarity index 93% rename from book/chapters/queue.adoc rename to book/content/part02/queue.asc index 73d85b86..a20f2f22 100644 --- a/book/chapters/queue.adoc +++ b/book/content/part02/queue.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Queue +[[queue]] +=== Queue (((Queue))) (((Data Structures, Linear, Queue))) (((First-In First-out))) @@ -11,7 +12,7 @@ endif::[] A queue is a linear data structure where the data flows in a *First-In-First-Out* (FIFO) manner. .Queue data structure is like a line of people: the First-in, is the First-out -image:image30.png[image,width=528,height=171] +image::image30.png[image,width=528,height=171] A queue is like a line of people at the bank; the person that arrived first is the first to go out as well. @@ -29,7 +30,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=constructor] We initialize the Queue creating a linked list. Now, let’s add the `enqueue` and `dequeue` methods. -== Insertion +==== Insertion (((Enqueue))) For inserting elements on queue, also know as *enqueue*, we add items to the back of the list using `addLast`: @@ -41,7 +42,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=enqueue, indent=0] As discussed, this operation has a constant runtime. -== Deletion +==== Deletion (((Dequeue))) For removing elements from a queue, also know as *dequeue*, we remove elements from the front of the list using `removeFirst`: @@ -53,7 +54,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=dequeue, indent=0] As discussed, this operation has a constant runtime. -== Implementation usage +==== Implementation usage We can use our Queue class like follows: @@ -65,7 +66,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=snippet, indent=0] You can see that the items are dequeue in the same order they were added, FIFO (first-in, first out). -== Queue Complexity +==== Queue Complexity As an experiment, we can see in the following table that if we had implemented the Queue using an array, its enqueue time would be _O(n)_ instead of _O(1)_. Check it out: (((Tables, Linear DS, Queue complexities))) diff --git a/book/chapters/stack.adoc b/book/content/part02/stack.asc similarity index 91% rename from book/chapters/stack.adoc rename to book/content/part02/stack.asc index b499e86f..6b4df7dc 100644 --- a/book/chapters/stack.adoc +++ b/book/content/part02/stack.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Stack +[[stack]] +=== Stack (((Stack))) (((Data Structures, Linear, Stack))) (((Last-In First-out))) @@ -13,7 +14,7 @@ The stack is a data structure that restricts the way you add and remove data. It An analogy is to think the stack is a rod and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out -image:image29.png[image,width=240,height=238] +image::image29.png[image,width=240,height=238] // #Change image from https://www.khanacademy.org/computing/computer-science/algorithms/towers-of-hanoi/a/towers-of-hanoi[Khan Academy]# @@ -33,7 +34,7 @@ As you can see in the stack constructor, we are using a linked list as the unde Let's now develop the insert and remove operations in a stack. -== Insertion +==== Insertion We can insert into a stack using the linked list’s `addLast` method. @@ -45,7 +46,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=add, indent=0] We are returning `this`, in case we want to chain multiple add commands. -== Deletion +==== Deletion Deleting is straightforward as well. @@ -57,7 +58,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=remove, indent=0] This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the full implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[here]. -== Implementation Usage +==== Implementation Usage We can use our stack implementation as follows: @@ -69,7 +70,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=snippet, indent=0] As you can see if we add new items they will be the first to go out to honor LIFO. -== Stack Complexity +==== Stack Complexity Implementing the stack with an array and linked list would lead to the same time complexity: (((Tables, Linear DS, Stack complexities))) @@ -83,4 +84,4 @@ Implementing the stack with an array and linked list would lead to the same time |=== // end::table[] -It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks especially useful for implementing <>. +It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks especially useful for implementing <>. diff --git a/book/chapters/tree-binary-tree-traversal.adoc b/book/content/part03/binary-search-tree-traversal.asc similarity index 94% rename from book/chapters/tree-binary-tree-traversal.adoc rename to book/content/part03/binary-search-tree-traversal.asc index 875c649e..58555c91 100644 --- a/book/chapters/tree-binary-tree-traversal.adoc +++ b/book/content/part03/binary-search-tree-traversal.asc @@ -1,13 +1,13 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Binary Tree Traversal +=== Binary Tree Traversal (((Binary Tree Traversal))) As mentioned before, there are different ways to visit all the nodes or search for a value in a binary tree. On this section, we are going to focus on depth-first tree traversal. -== In Order Traversal +==== In Order Traversal (((Tree Traversal, In Order))) (((In Order Traversal))) If your tree happens to be a binary search tree (BST), then you can use "in order" traversal to get the values sorted in ascending order. To accomplish this, you have to visit the nodes in a `left-root-right` order. @@ -35,7 +35,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=inOrderTraver This function goes recursively to the leftmost element and then yield that node, then we go to the right child (if any) and repeat the process. This method will get us the values ordered. -== Pre Order Traversal +==== Pre Order Traversal (((Tree Traversal, Pre Order))) (((Pre Order Traversal))) Pre-order traversal visits nodes in this order `root-left-right` recursively. @@ -64,7 +64,7 @@ If we have the following tree: Pre-order traverval will return `10, 5, 4, 3, 30, 15, 40`. -== Post-order Traversal +==== Post-order Traversal (((Tree Traversal, Post Order))) (((Post Order Traversal))) Post-order traversal goes to each node in this order `left-right-root` recursively. diff --git a/book/chapters/tree-binary-search-tree.adoc b/book/content/part03/binary-search-tree.asc similarity index 91% rename from book/chapters/tree-binary-search-tree.adoc rename to book/content/part03/binary-search-tree.asc index 68adf401..4c506cda 100644 --- a/book/chapters/tree-binary-search-tree.adoc +++ b/book/content/part03/binary-search-tree.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Binary Search Tree +=== Binary Search Tree (((Binary Search Tree))) (((BST))) (((Data Structures, Non-Linear, Binary Search Tree))) @@ -14,7 +14,7 @@ endif::[] * The order of nodes values must be: `left child < parent < right child`. * Nodes might need re-ordering after each insert/delete operation to keep the `left <= parent < right` constraint. -== Implementing a Binary Search Tree +==== Implementing a Binary Search Tree The first step is to implement the Binary Tree Node, which can hold 0, 1 or 2 children. @@ -47,7 +47,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=snippet, inde With the methods `add` and `remove` we have to guarantee that our tree always has one root element from where we can navigate left or right based on the value that we are looking for. Let's implement those `add` method first: -=== Inserting new elements in a BST +===== Inserting new elements in a BST .For inserting an element, in a BST, we have two scenarios: 1. If the tree is empty (root element is null), we add the newly created node as root, and that's it! @@ -57,7 +57,7 @@ With the methods `add` and `remove` we have to guarantee that our tree always ha For instance, let’s say that we want to insert the values 19, 21, 10, 2, 8 in a BST: .Inserting values on a BST. -image:image36.png[image,width=528,height=329] +image::image36.png[image,width=528,height=329] In the last box of the image above, when we are inserting node 18, we start by the root (19). Since 18 is less than 19, then we move left. Node 18 is greater than 10, so we move right. There’s an empty spot, and we place it there. Let’s code it up: @@ -69,7 +69,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=add, indent=0 <1> We are using a helper function `findNodeAndParent` to iterate through the tree finding a node with current value “found” and its parent (implementation on the next section). <2> We are taking care of duplicates. Instead of inserting duplicates we are keeping a multiplicity tally. We have to decrease it when removing nodes. -=== Finding a value in a BST +===== Finding a value in a BST We can implement the find method using the helper `findNodeAndParent` as follows: @@ -81,7 +81,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=find, indent= `findNodeAndParent` is a recursive function that goes to the left child or right depending on the value. However, if the value already exists, it will return it in `found` variable. -=== Removing elements from a BST +===== Removing elements from a BST Deleting a node from a BST have three cases. @@ -90,39 +90,39 @@ Deleting a node from a BST have three cases. 2. parent with one child 3. parent with two children/root. -==== Removing a leaf (Node with 0 children) +====== Removing a leaf (Node with 0 children) Deleting a leaf is the easiest; we look for their parent and set the child to null. .Removing node without children from a BST. -image:image37.png[image,width=528,height=200] +image::image37.png[image,width=528,height=200] Node 18, will be hanging around until the garbage collector is run. However, there’s no node referencing to it so it won’t be reachable from the tree anymore. -==== Removing a parent (Node with 1 children) +====== Removing a parent (Node with 1 children) Removing a parent is not as easy since you need to find new parents for its children. .Removing node with 1 children from a BST. -image:image38.png[image,width=528,height=192] +image::image38.png[image,width=528,height=192] In the example, we removed node `10` from the tree, so its child (node 2) needs a new parent. We made node 19 the new parent for node 2. -==== Removing a full parent (Node with 2 children) or root +====== Removing a full parent (Node with 2 children) or root Removing a parent of two children is the trickiest of all cases because we need to find new parents for two children. (This sentence sounds tragic out of context 😂) .Removing node with two children from a BST. -image:image39.png[image,width=528,height=404] +image::image39.png[image,width=528,height=404] In the example, we delete the root node 19. This deletion leaves two orphans (node 10 and node 21). There are no more parents because node 19 was the *root* element. One way to solve this problem is to *combine* the left subtree (Node 10 and descendants) into the right subtree (node 21). The final result is node 21 is the new root. What would happen if node 21 had a left child (e.g., node 20)? Well, we would move node 10 and its descendants' bellow node 20. -==== Implementing removing elements from a BST +====== Implementing removing elements from a BST All the described scenarios removing nodes with zero, one and two children can be sum up on this code: @@ -158,16 +158,16 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=leftMost, ind That’s all we need to remove elements from a BST. Check out the complete BST implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/trees/binary-search-tree.js#L5[here]. -== Differentiating a balanced and non-balanced Tree +==== Differentiating a balanced and non-balanced Tree As we insert and remove nodes from a BST we could end up like the tree on the left: .Balanced vs. Unbalanced Tree. -image:image40.png[image,width=454,height=201] +image::image40.png[image,width=454,height=201] The tree on the left is unbalanced. It looks like a Linked List and has the same runtime! Searching for an element would be *O(n)*, yikes! However, on a balanced tree, the search time is *O(log n)*, which is pretty good! That’s why we always want to keep the tree balanced. In further chapters, we are going to explore how to keep a tree balanced after each insert/delete. -== Tree Complexity +==== Tree Complexity We can sum up the tree operations using Big O notation: (((Tables, Non-Linear DS, Binary Search Tree complexities))) diff --git a/book/chapters/graph-search.adoc b/book/content/part03/graph-search.asc similarity index 65% rename from book/chapters/graph-search.adoc rename to book/content/part03/graph-search.asc index cb64a3bc..d19d5fd6 100644 --- a/book/chapters/graph-search.adoc +++ b/book/content/part03/graph-search.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Graph Search +=== Graph Search Graph search allows you to visit search elements. @@ -11,36 +11,38 @@ WARNING: Graph search is very similar to <>. So, if yo There are two ways to navigate the graph, one is using Depth-First Search (DFS) and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. -[graphviz, directed graph, png] -.... -digraph G { +image::directed-graph.png[directed graph] - node [fillcolor="#F8E71C" style=filled shape=circle] 0; - node [fillcolor="#F5A623"] 1; - node [fillcolor="#B8E986"] 2; - node [fillcolor="#BD10E0"] 3; - node [fillcolor="#50E3C2"] 4; - node [fillcolor="#4A90E2"] 5; - // node [fillcolor="#FF5252"] 6; +// [graphviz, directed graph, png] +// .... +// digraph G { - 0 -> 5 - 0 -> 4 - 0 -> 1 - 1 -> 4 - 1 -> 3 - 2 -> 1 - 3 -> 4 - 3 -> 2 +// node [fillcolor="#F8E71C" style=filled shape=circle] 0; +// node [fillcolor="#F5A623"] 1; +// node [fillcolor="#B8E986"] 2; +// node [fillcolor="#BD10E0"] 3; +// node [fillcolor="#50E3C2"] 4; +// node [fillcolor="#4A90E2"] 5; +// // node [fillcolor="#FF5252"] 6; - // label="DFS" +// 0 -> 5 +// 0 -> 4 +// 0 -> 1 +// 1 -> 4 +// 1 -> 3 +// 2 -> 1 +// 3 -> 4 +// 3 -> 2 - { rank=same; 3, 1 } - { rank=same; 0, 4 } +// // label="DFS" -} -.... +// { rank=same; 3, 1 } +// { rank=same; 0, 4 } -== Depth-First Search for Graphs +// } +// .... + +==== Depth-First Search for Graphs With Depth-First Search (DFS) we go deep before going wide. @@ -52,7 +54,7 @@ So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. // TODO: add arrows to show DFS and create another one for BFS -== Breadth-First Search for Graphs +==== Breadth-First Search for Graphs With Breadth-First Search (BFS) we go wide before going deep. @@ -64,7 +66,7 @@ After all the children of node `0` are visited it continue with all the children In summary, BFS would visit the graph: `[0, 5, 1, 4, 3, 2]` -== Depth-First Search vs. Breadth-First Search in a Graph +==== Depth-First Search vs. Breadth-First Search in a Graph DFS and BFS can implementation can be almost identical; the difference is the underlying data structured. In our implementation, we have a generic `graphSearch` where we pass the first element to start the search the data structure that we can to use: @@ -74,13 +76,13 @@ DFS and BFS can implementation can be almost identical; the difference is the un include::{codedir}/data-structures/graphs/graph.js[tag=graphSearch,indent=0] ---- -Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. +Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. -TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. +TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. You might wonder what the difference between search algorithms in a tree and a graph is? Check out the next section. -== DFS/BFS on Tree vs Graph +==== DFS/BFS on Tree vs Graph The difference between searching a tree and a graph is that the tree always has a starting point (root node). However, in a graph, you can start searching anywhere. There's no root. diff --git a/book/chapters/graph.adoc b/book/content/part03/graph.asc similarity index 91% rename from book/chapters/graph.adoc rename to book/content/part03/graph.asc index a4ee9352..35d15b40 100644 --- a/book/chapters/graph.adoc +++ b/book/content/part03/graph.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Graph +[[graph]] +=== Graph (((Graph))) (((Data Structures, Non-Linear, Graph))) Graphs are one of my favorite data structures. @@ -26,32 +27,32 @@ The only difference is that it uses an *array* of adjacent nodes instead of just Other difference between a linked list and graph is that a linked list always has a root node (or first element), while the graph doesn’t. You can start traversing a graph from anywhere. Let’s examine these graph properties! -== Graph Properties +==== Graph Properties The connection between two nodes is called *edge*. Also, nodes might be called *vertex*. .Graph is composed of vertices/nodes and edges -image:image42.png[image,width=305,height=233] +image::image42.png[image,width=305,height=233] -=== Directed Graph vs Undirected +===== Directed Graph vs Undirected A graph can be either *directed* or *undirected*. .Graph: directed vs undirected -image:image43.jpg[image,width=469,height=192] +image::image43.jpg[image,width=469,height=192] An *undirected graph* has edges that are *two-way street*. E.g., On the undirected example, you can traverse from the green node to the orange and vice versa. A *directed graph (digraph)* has edges that are *one-way street*. E.g., On the directed example, you can only go from green node to orange and not the other way around. When one node has an edge to itself is called a *self-loop*. -=== Graph Cycles +===== Graph Cycles A graph can have *cycles* or not. .Cyclic vs Acyclic Graphs. -image:image44.jpg[image,width=444,height=194] +image::image44.jpg[image,width=444,height=194] (((Cyclic Graph))) A *cyclic graph* is the one that you can pass through a node more than once. @@ -64,10 +65,10 @@ An acyclic graph is the one that you can’t pass through a node more than once. (((DAG))) The *Directed Acyclic Graph (DAG)* is unique. It has many applications like scheduling tasks, spreadsheets change propagation, and so forth. DAG is also called *Tree* data structure only when each node has only *one parent*. -=== Connected vs Disconnected vs Complete Graphs +===== Connected vs Disconnected vs Complete Graphs .Different kinds of graphs: disconnected, connected, and complete. -image:image45.png[image,width=1528,height=300] +image::image45.png[image,width=1528,height=300] A *disconnected graph* is one that has one or more subgraph. In other words, a graph is *disconnected* if two nodes don’t have a path between them. @@ -75,16 +76,16 @@ A *connected graph* is the opposite to disconnected, there’s a path between ev A *complete graph* is where every node is adjacent to all the other nodes in the graph. E.g., If there are seven nodes, every node has six edges. -=== Weighted Graphs +===== Weighted Graphs (((Weighted Graphs))) Weighted graphs have labels in the edges (a.k.a *weight* or *cost*). The link weight can represent many things like distance, travel time, or anything else. .Weighted Graph representing USA airports distance in miles. -image:image46.png[image,width=528,height=337] +image::image46.png[image,width=528,height=337] For instance, a weighted graph can have a distance between nodes. So, algorithms can use the weight and optimize the path between them. -== Exciting Graph applications in real-world +==== Exciting Graph applications in real-world Now that we know what graphs are and some of their properties. Let’s discuss some real-life usages of graphs. @@ -107,19 +108,19 @@ Graphs become a metaphor where nodes and edges model something from our physical There are endless applications for graphs in electronics, social networks, recommendation systems and many more. That’s cool and all, but how do we represent graphs in code? Let’s see that in the next section. -== Representing Graphs +==== Representing Graphs There are two main ways to graphs one is: * Adjacency Matrix * Adjacency List -=== Adjacency Matrix +===== Adjacency Matrix (((Adjacency Matrix))) Representing graphs as adjacency matrix is done using a two-dimensional array. For instance, let’s say we have the following graph: .Graph and its adjacency matrix. -image:image47.png[image,width=438,height=253] +image::image47.png[image,width=438,height=253] The number of vertices |V| define the size of the matrix. In the example, we have five vertices, so we have a 5x5 matrix. @@ -161,16 +162,16 @@ TIP: When the graph has few connections compared to the number of nodes we say t The space complexity of the adjacency matrix is *O(|V|^2^)*, where |V| is the number of vertices/nodes. -=== Adjacency List +===== Adjacency List (((Adjacency List))) Another way to represent a graph is by using an adjacency list. This time instead of using an array (matrix) we use a list. .Graph represented as an Adjacency List. -image:image48.png[image,width=528,height=237] +image::image48.png[image,width=528,height=237] If we want to add a new node to the list, we can do it by adding one element to the end of the array of nodes *O(1)*. In the next section, we are going to explore the running times of all operations in an adjacency list. -== Implementing a Graph data structure +==== Implementing a Graph data structure Since adjacency lists are more efficient (than adjacency matrix), we are going to use to implement a graph data structure. @@ -184,7 +185,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=constructor] Notice that the constructor takes a parameter. The `edgeDirection` allow us to use one class for both undirected and directed graphs. -== Adding a vertex +==== Adding a vertex For adding a vertex, we first need to check if the node already exists. If so, we return the node. @@ -199,7 +200,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=addVertex, indent=0] If the node doesn't exist, then we create the new node and add it to a `HashMap`. -TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. +TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. The `key` is the node's value, while the `value` is the newly created node. @@ -212,7 +213,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=constructor, indent=0] ---- -== Deleting a vertex +==== Deleting a vertex .Graphs's `removeVertex` method [source, javascript] @@ -235,7 +236,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] All adjacencies are stored as a HashSet to provide constant time deletion. -== Adding an edge +==== Adding an edge An edge is a connection between two nodes (vertices). If the graph is undirected means that every link is a two-way street. When we create the edge from node 1 to node 2, we also need to establish a connection between node 2 and 1 for undirected graphs. @@ -258,7 +259,7 @@ We can add adjacencies using the `addAdjacent` method from the Node class. include::{codedir}/data-structures/graphs/node.js[tag=addAdjacent, indent=0] ---- -== Querying Adjacency +==== Querying Adjacency .Graphs's `areAdjacents` method [source, javascript] @@ -273,7 +274,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=isAdjacent, indent=0] ---- -== Deleting an edge +==== Deleting an edge .Graphs's `removeEdge` method [source, javascript] @@ -287,7 +288,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=removeEdge, indent=0] include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] ---- <<< -== Graph Complexity +==== Graph Complexity (((Tables, Non-Linear DS, Graph adjacency matrix/list complexities))) // tag::table[] diff --git a/book/chapters/map-hashmap.adoc b/book/content/part03/hashmap.asc similarity index 95% rename from book/chapters/map-hashmap.adoc rename to book/content/part03/hashmap.asc index 9f4ceabb..2a00067f 100644 --- a/book/chapters/map-hashmap.adoc +++ b/book/content/part03/hashmap.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= HashMap +[[hashmap]] +==== HashMap (((HashMap))) (((HashTable))) (((Data Structures, Non-Linear, HashMap))) @@ -23,7 +24,7 @@ How are the keys mapped to their values? Using a hash function. Here’s an illustration: .Internal HashMap representation -image:image41.png[image,width=528,height=299] +image::image41.png[image,width=528,height=299] .This is the main idea: @@ -36,7 +37,7 @@ In a HashMap, a *collision* is when different keys lead to the same index. They Having a big bucket size can avoid a collision but also can waste too much memory. We are going to build an _optimized_ HashMap that re-sizes itself when it is getting full. This auto-resizing avoids collisions and don't need to allocate too much memory upfront. Let’s start with the *hash function*. -== Designing an optimized hash function +===== Designing an optimized hash function To minimize collisions, we need to create an excellent hash function. @@ -52,7 +53,7 @@ It’s no practical and memory-wise wasteful to have a perfect hash function, so Before doing a great hash function, let's see what a lousy hash function looks like. 😉 -=== Analysing collisions on bad hash code functions +====== Analysing collisions on bad hash code functions The goal of a hash code function is to convert any value given into a positive integer — a common way to accomplish with summing each string’s Unicode value. @@ -152,7 +153,7 @@ Now it’s more evenly distributed!! [big]#😎👍# Let’s design a better HashMap with what we learned. -=== Implementing an optimized hash function +====== Implementing an optimized hash function We are going to use a battle-tested non-cryptographic hash function called FNV Hash. @@ -189,7 +190,7 @@ FVN-1a hash function is a good trade-off between speed and collision prevention. Now that we have a proper hash function. Let’s move on with the rest of the HashMap implementation. -== Implementing a HashMap in JavaScript +===== Implementing a HashMap in JavaScript Let’s start by creating a class and its constructor to initialize the hash map. We are going to have an array called `buckets` to hold all the data. @@ -209,7 +210,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getLoadFactor, Notice that we are also keeping track of collisions (for benchmarking purposes) and a load factor. *The load factor* measures how full the hash map is. We don’t want to be fuller than 75%. If the HashMap is getting too full, then we are going to fix it doing a *rehash* (more on that later). -=== Inserting elements in a HashMap +====== Inserting elements in a HashMap To insert values into a HashMap, we first convert the *key* into an *array index* using the hash and compression function. Each bucket of the array will have an object with the shape of `{key, value}`. @@ -228,7 +229,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=set, indent=0] Notice, that we are using a function called `getEntry` to check if the key already exists. It gets the index of the bucket corresponding to the key and then checks if the entry with the given key exists. We are going to implement this function in a bit. -=== Getting values out of a HashMap +====== Getting values out of a HashMap For getting values out of the Map, we do something similar to inserting. We convert the key into an `index` using the hash function, then we that `index` we look for the value in the bucket. @@ -239,7 +240,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getEntry, inde ---- <1> Convert key to an array index. <2> If the bucket is empty create a new linked list -<3> Use Linked list's <> method to find value on the bucket. +<3> Use Linked list's <> method to find value on the bucket. <4> Return `bucket` and `entry` if found. With the help of the `getEntry` method, we can do the `HashMap.get` and `HashMap.has` methods: @@ -260,7 +261,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=has, indent=0] For `HashMap.has` we only care if the value exists or not, while that for `HashMap.get` we want to return the value or `undefined` if it doesn’t exist. -=== Deleting from a HashMap +====== Deleting from a HashMap Removing items from a HashMap is not too different from what we did before. @@ -274,7 +275,7 @@ If the bucket doesn’t exist or is empty, we don't have to do anything else. If https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L218[`LinkedList.remove` ] method. -== Rehashing a HashMap +===== Rehashing a HashMap Rehashing is a technique to minimize collisions when a hash map is getting full. It doubles the size of the map and recomputes all the hash codes and insert data in the new buckets. @@ -289,7 +290,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=rehash, indent In the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/maps/hash-maps/primes.js#L33[prime.js] file you can find the implementation for finding the next prime. Also, you can see the full HashMap implementation on this file: https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/maps/hash-maps/hash-map.js#L1[hashmap.js] -== HashMap time complexity +===== HashMap time complexity Hash Map it’s very optimal for searching values by key in constant time *O(1)*. However, searching by value is not any better than an array since we have to visit every value *O(n)*. (((Tables, Non-Linear DS, HashMap complexities))) diff --git a/book/chapters/map-hashmap-vs-treemap.adoc b/book/content/part03/map.asc similarity index 55% rename from book/chapters/map-hashmap-vs-treemap.adoc rename to book/content/part03/map.asc index 732d81e1..d03dae4f 100644 --- a/book/chapters/map-hashmap-vs-treemap.adoc +++ b/book/content/part03/map.asc @@ -1,9 +1,39 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= HashMap vs TreeMap +[[map]] +=== Map +(((Map))) +(((Data Structures, Non-Linear, Map))) +A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. + +IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. + +Many languages have maps already built-in. JavaScript/Node has `Map`: + +.JavaScript Built-in Map Usage +[source, javascript] +---- +include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] +---- + +In short, you set `key`/`value` pair and then you can get the `value` using the `key`. + +The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: + +* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. +* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. + +<<< +include::hashmap.asc[] + +<<< +include::treemap.asc[] + +<<< +==== HashMap vs TreeMap .A map can be implemented using hash functions or binary search tree: - *HashMap*: it’s a map implementation using an *array* and *hash function*. The job of the hash function is to convert the key into an index that contains the matching data. Optimized HashMap can have an average runtime of *O(1)*. @@ -12,12 +42,12 @@ endif::[] .When to use a TreeMap vs. HashMap? * `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. -* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average.  +* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. * `HashMap`’s keys are in insertion order (or random depending in the implementation). `TreeMap`’s keys are always sorted. * `TreeMap` offers some statistical data for free such as: get minimum, get maximum, median, find ranges of keys. `HashMap` doesn’t. * `TreeMap` has a guarantee always an *O(log n)*, while `HashMap`s has an amortized time of *O(1)* but in the rare case of a rehash, it would take an *O(n)*. -== TreeMap Time complexity vs HashMap +===== TreeMap Time complexity vs HashMap As we discussed so far, there is a trade-off between the implementations. (((Tables, Non-Linear DS, HashMap/TreeMap complexities))) diff --git a/book/chapters/set.adoc b/book/content/part03/set.asc similarity index 91% rename from book/chapters/set.adoc rename to book/content/part03/set.asc index e1e71980..79dd30e9 100644 --- a/book/chapters/set.adoc +++ b/book/content/part03/set.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Set +[[set]] +=== Set (((Set))) (((Data Structures, Non-Linear, Set))) A set is a data structure where duplicated entries are not allowed. Set is like an array with unique values. @@ -37,9 +38,9 @@ TIP: A hint... it should perform all operations in *O(1)** or at most *O(log n)* If we use a `map`, we can accomplish this. However, maps use a key/value pair. If we only use the keys, we can avoid duplicates. Since in a `map` you can only have one key at a time. -As you might remember from the <> chapter, there are two ways of implementing a `map` and both can be used to create a `set`. Let's explore the difference between the two implementations are. +As you might remember from the <> chapter, there are two ways of implementing a `map` and both can be used to create a `set`. Let's explore the difference between the two implementations are. -== HashSet vs TreeSet +==== HashSet vs TreeSet We can implement a `map` using a *balanced BST* and using a *hash function*. If we use them to implement a `Set`, then we would have a `HashSet` and `TreeSet` respectively. @@ -50,7 +51,8 @@ We can implement a `map` using a *balanced BST* and using a *hash function*. If Let’s implement both! -== TreeSet +[[tree-set]] +==== TreeSet (((TreeSet))) (((Data Structures, Non-Linear, TreeSet))) We are to use a self-balanced BST (Red-Black Tree) to implement TreeSet. @@ -75,7 +77,7 @@ expect(Array.from(set.keys())).toEqual([1, 2, 3]); Ok, now let’s implement the add method. -=== Adding elements to a TreeSet +===== Adding elements to a TreeSet For adding values to the set, we `Tree.add` method. @@ -89,7 +91,7 @@ Our <> can hold duplicated Don’t worry about adding extra lookups. The `Tree.has` is also very performant *O(log n)*. -=== Searching for values in a TreeSet +===== Searching for values in a TreeSet Again, we rely on the Tree implementation to do the heavy lifting: @@ -99,7 +101,7 @@ Again, we rely on the Tree implementation to do the heavy lifting: include::{codedir}/data-structures/sets/tree-set.js[tag=has, indent=0] ---- -=== Deleting elements from a TreeSet +===== Deleting elements from a TreeSet We delete the elements from the TreeSet using the remove method of the BST. @@ -111,7 +113,7 @@ include::{codedir}/data-structures/sets/tree-set.js[tag=delete, indent=0] Voilà! That’s it! -=== Converting TreeSet to Array +===== Converting TreeSet to Array A common use case for a Set is to convert it to an array or use in an iterator (for loops, forEach, …). Let’s provide the method for that: @@ -151,7 +153,8 @@ Check out our https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243c Let’s now, implement a `HashSet`. -== HashSet +[[hashset]] +==== HashSet (((HashSet))) (((Data Structures, Non-Linear, HashSet))) The *HashSet* is the set implementation using a HashMap as its underlying data structure. @@ -167,7 +170,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=constructor] This constructor is useful for converting an array to set and initializing the `HashMap`. -=== Inserting values to a HashSet +===== Inserting values to a HashSet To insert items in a HashSet we use the `set` method of the `HashMap`: @@ -180,7 +183,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=add, indent=0] `HashMap` stores key/value pairs, but for this, we only need the key, and we ignore the value. -=== Finding values in a HashSet +===== Finding values in a HashSet We use the method `has` to check if a value is on the `Set` or not. @@ -193,7 +196,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=has, indent=0] Internally, the `HashMap` will convert the key into an array index using a hash function. If there’s something in the array index bucket, it will return true, and if it’s empty, it will be false. -=== Deleting values from a HashSet +===== Deleting values from a HashSet For deleting a value from a hashSet we use the HashMap’s delete method: @@ -205,7 +208,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=delete, indent=0] This method has an average runtime of *O(1)*. -== HashSet vs HashMap Time Complexity +==== HashSet vs HashMap Time Complexity We can say that `HashMap` in on average more performant O(1) vs. O(log n). However, if a rehash happens, it will take *O(n)* instead of *O(1)*. A `TreeSet` is always *O(log n)*. diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc new file mode 100644 index 00000000..4739c624 --- /dev/null +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -0,0 +1,25 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Summary + +In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. +(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) + +// tag::table[] +.Time and Space Complexity for Graph-based Data Structures +|=== +.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity +^|_Index/Key_ ^|_Value_ +| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) +| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +|=== +{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. +// end::table[] diff --git a/book/chapters/tree.adoc b/book/content/part03/tree-intro.asc similarity index 77% rename from book/chapters/tree.adoc rename to book/content/part03/tree-intro.asc index 542c4a7a..632e22ee 100644 --- a/book/chapters/tree.adoc +++ b/book/content/part03/tree-intro.asc @@ -1,21 +1,22 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Tree +[[tree]] +=== Tree (((Tree))) (((Data Structures, Non-Linear, Tree))) A tree is a non-linear data structure where a node can have zero or more connections. The topmost node in a tree is called *root*. The linked nodes to the root are called *children* or *descendants*. .Tree Data Structure: root node and descendants. -image:image31.jpg[image,width=404,height=240] +image::image31.jpg[image,width=404,height=240] As you can see in the picture above, this data structure resembles an inverted tree hence the name. It starts with a *root* node and *branch* off with its descendants, and finally *leaves*. -== Implementing a Tree +==== Implementing a Tree -Implementing a tree is not too hard. It’s similar to a <>. The main difference is that instead of having a `next` and `previous` links, we have an infinite number of linked nodes (children/descendants). +Implementing a tree is not too hard. It’s similar to a <>. The main difference is that instead of having a `next` and `previous` links, we have an infinite number of linked nodes (children/descendants). .Tree's node constructor [source, javascript] @@ -26,11 +27,11 @@ include::{codedir}/data-structures/trees/tree-node.js[tag=snippet] Simple! Right? But there are some constraints that you have to keep at all times. .Tree data structures constraints -1. *Loops*: You have to be careful *not* to make a circular loop. Otherwise, this wouldn’t be a tree anymore but a <>! E.g., Node A has B as a child, then Node B list Node A as its descendant forming a loop. ‍️ -2. *Parents*: A node with more than two parents. Again, if that happens is no longer a tree but a <>. -3. *Root*: a tree must have only one root. Two non-connected parts are not a tree. <> can have non-connected portions and doesn’t have root. +1. *Loops*: You have to be careful *not* to make a circular loop. Otherwise, this wouldn’t be a tree anymore but a <>! E.g., Node A has B as a child, then Node B list Node A as its descendant forming a loop. ‍️ +2. *Parents*: A node with more than two parents. Again, if that happens is no longer a tree but a <>. +3. *Root*: a tree must have only one root. Two non-connected parts are not a tree. <> can have non-connected portions and doesn’t have root. -== Basic concepts +==== Basic concepts .Here’s a summary of the three basic concepts: * The topmost node is called *root*. @@ -49,30 +50,30 @@ Simple! Right? But there are some constraints that you have to keep at all times * The *depth of a tree* is the distance (edge count) from the root to the farthest leaf. .Tree anatomy -image:image31.jpg[image] +image::image31.jpg[image] -== Types of Binary Trees +==== Types of Binary Trees There are different kinds of trees depending on the restrictions. E.g. The trees that have two children or less are called *binary tree*, while trees with at most three children are called *Ternary Tree*. Since binary trees are most common we are going to cover them here and others in another chapter. -=== Binary Tree +===== Binary Tree (((Binary Tree))) (((Data Structures, Non-Linear, Binary Tree))) The binary restricts the nodes to have at most two children. Trees, in general, can have 3, 4, 23 or more, but not binary trees. .Binary tree has at most 2 children while non-binary trees can have more. -image:image32.png[image,width=321,height=193] +image::image32.png[image,width=321,height=193] Binary trees are one of the most used kinds of tree, and they are used to build other data structures. .Binary Tree Applications -- <> -- <> +- <> +- <> - Priority Queues -- <> +- <> - -=== Binary Search Tree (BST) +[[bst]] +===== Binary Search Tree (BST) (((Binary Search Tree))) (((Data Structures, Non-Linear, Binary Search Tree))) The Binary Search Tree (BST) is a specialization of the binary tree. BST has the same restriction as a binary tree; each node has at most two children. However, there’s another restriction: the values are ordered. It means the left child’s value has to be less or equal than the parent. In turn, the right child’s value has to be bigger than the parent. @@ -80,10 +81,10 @@ The Binary Search Tree (BST) is a specialization of the binary tree. BST has the > BST: left ≤ parent < right .BST or ordered binary tree vs. non-BST. -image:image33.png[image,width=348,height=189] +image::image33.png[image,width=348,height=189] -=== Binary Heap +===== Binary Heap (((Binary Heap))) (((Heap))) (((Max-Heap))) @@ -92,7 +93,7 @@ image:image33.png[image,width=348,height=189] The heap (max-heap) is a type of binary tree where the children's values are higher than the parent. Opposed to the BST, the left child doesn’t have to be smaller than the right child. .Heap vs BST -image:image34.png[image,width=325,height=176] +image::image34.png[image,width=325,height=176] The (max) heap has the maximum value in the root, while BST doesn’t. @@ -100,7 +101,7 @@ There are two kinds of heaps: min-heap and max-heap. For a *max-heap*, the root has the highest value. The heap guarantee that as you move away from the root, the values get smaller. The opposite is true for a *min-heap*. In a min-heap, the lowest value is at the root, and as you go down the lower to the descendants, they will keep increasing values. .Max-heap keeps the highest value at the top while min-heap keep the lowest at the root. -image:image35.png[image,width=258,height=169] +image::image35.png[image,width=258,height=169] .Heap vs. Binary Search Tree diff --git a/book/chapters/tree-search.adoc b/book/content/part03/tree-search-traversal.asc similarity index 84% rename from book/chapters/tree-search.adoc rename to book/content/part03/tree-search-traversal.asc index eb80efd2..418edaae 100644 --- a/book/chapters/tree-search.adoc +++ b/book/content/part03/tree-search-traversal.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Tree Search & Traversal +=== Tree Search & Traversal So far we covered, how to insert/delete/search values in a binary search tree (BST). However, not all binary trees are BST, so there are other ways to look for values or visit all nodes in a particular order. @@ -34,8 +34,8 @@ Why do we care? Well, there are specific problems that you can solve more optima Let's cover the Breadth-first search (BFS) and Depth-first search (DFS). -[Breadth First Search] -== Breadth-First Search for Binary Tree +[[bfs-tree]] +==== Breadth-First Search for Binary Tree (((BFS))) (((Breadth-First Search))) (((Tree, Breadth-First Search))) @@ -48,7 +48,7 @@ Let's how can we implement it! include::{codedir}/data-structures/trees/binary-search-tree.js[tag=bfs,indent=0] ---- -As you see, the BFS uses a <> data structure. We enqueue all the children of the current node and then dequeue them as we visit them. +As you see, the BFS uses a <> data structure. We enqueue all the children of the current node and then dequeue them as we visit them. Note the asterisk (`*`) in front of the function means that this function is a generator that yields values. (((JavaScript Notes, Generators))) @@ -88,8 +88,8 @@ console.log(Array.from(dummyIdMaker())); // [0, 1, 2] **** - -== Depth-First Search for Binary Tree +[[dfs-tree]] +==== Depth-First Search for Binary Tree (((DFS))) (((Depth-First Search))) (((Tree, Depth-First Search))) @@ -101,16 +101,16 @@ Depth-First search goes deep (depth) before going wide. It means that starting f include::{codedir}/data-structures/trees/binary-search-tree.js[tag=dfs,indent=0] ---- -This is an iterative implementation of a DFS using an <>. -It's almost identical to the BFS, but instead of using a <> we use a Stack. +This is an iterative implementation of a DFS using an <>. +It's almost identical to the BFS, but instead of using a <> we use a Stack. We can also implement it as recursive functions are we are going to see in the <> section. -== Depth-First Search vs. Breadth-First Search +==== Depth-First Search vs. Breadth-First Search We can see visually the difference between how the DFS and BFS search for nodes: .Depth-First Search vs. Breadth-First Search -image:depth-first-search-dfs-breadth-first-search-bfs.jpg[] +image::depth-first-search-dfs-breadth-first-search-bfs.jpg[] As you can see the DFS in two iterations is already at one of the farthest nodes from the root while BFS search nearby nodes first. @@ -119,9 +119,3 @@ As you can see the DFS in two iterations is already at one of the farthest nodes .Use BFS when: - The node you are looking for is *nearby* the root. - -:leveloffset: +1 -<<< -include::tree-binary-tree-traversal.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/map-treemap.adoc b/book/content/part03/treemap.asc similarity index 94% rename from book/chapters/map-treemap.adoc rename to book/content/part03/treemap.asc index d862689f..61e91436 100644 --- a/book/chapters/map-treemap.adoc +++ b/book/content/part03/treemap.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= TreeMap +[[treemap]] +==== TreeMap (((TreeMap))) (((Data Structures, Non-Linear, TreeMap))) A TreeMap is a Map implementation using Binary Search Trees. @@ -35,7 +36,7 @@ class TreeMap { } ---- -== Inserting values into a TreeMap +===== Inserting values into a TreeMap For inserting a value on a TreeMap, we first need to inialize the tree: @@ -57,7 +58,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=set, indent=0] Adding values is very easy (once we have the underlying tree implementation). -== Getting values out of a TreeMap +===== Getting values out of a TreeMap When We search by key in a tree map, it takes *O(log n)*. This is the implementation: @@ -81,7 +82,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=iterators, ind Generators are useful for producing values that can you can iterate in a `for...of` loop. Generators use the `function*` syntax which expects to have a `yield` with a value. **** -== Deleting values from a TreeMap +===== Deleting values from a TreeMap Removing elements from TreeMap is simple. diff --git a/book/chapters/algorithmic-toolbox.adoc b/book/content/part04/algorithmic-toolbox.asc similarity index 90% rename from book/chapters/algorithmic-toolbox.adoc rename to book/content/part04/algorithmic-toolbox.asc index b9041c5a..467d5180 100644 --- a/book/chapters/algorithmic-toolbox.adoc +++ b/book/content/part04/algorithmic-toolbox.asc @@ -1,4 +1,10 @@ -= Algorithmic Toolbox +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +[[algorithms-toolbox]] +=== Algorithmic Toolbox Have you ever given a programming problem and freeze without knowing where to start? Well, in this section we are going to give some tips, so you don't get stuck while coding. @@ -17,7 +23,7 @@ TIP: TL;DR: Don't start coding right away. First, solve the problem, then write .. If anything else fails, how would you solve it the dumbest way possible (brute force). We can optimize it later. . *Test* your algorithm idea with multiple examples . *Optimize* the solution –Only optimize when you have something working don't try to do both at the same time! -.. Can you trade-off space for speed? Use a <> to speed up results! +.. Can you trade-off space for speed? Use a <> to speed up results! .. Do you have a bunch of recursive and overlapping problems? Try <>. .. Re-read requirements and see if you can take advantage of anything. E.g. is the array sorted? . *Write Code*, yes, now you can code. diff --git a/book/chapters/backtracking.adoc b/book/content/part04/backtracking.asc similarity index 93% rename from book/chapters/backtracking.adoc rename to book/content/part04/backtracking.asc index ee58db8a..7faaf9f1 100644 --- a/book/chapters/backtracking.adoc +++ b/book/content/part04/backtracking.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Backtracking +=== Backtracking (((Backtracking))) (((Algorithmic Techniques, Backtracking))) Backtracking algorithms are used to find *all (or some)* solutions that satisfy a constraint. @@ -15,7 +15,7 @@ it stops and steps back (backtracks) to try another alternative. Some examples that use backtracking is a solving Sudoku/crosswords puzzle, and graph operations. ifndef::backend-pdf[] -image:Sudoku_solved_by_bactracking.gif[] +image::Sudoku_solved_by_bactracking.gif[] endif::backend-pdf[] Listing all possible solutions might sound like a brute force. @@ -30,7 +30,7 @@ It stops evaluating a path as soon as some of the conditions are broken and move However, it can only be applied if a quick test can be run to tell if a candidate will contribute to a valid solution. **** -== How to develop backtracking algorithms? +==== How to develop backtracking algorithms? Backtracking algorithms can be tricky to get right or reason about, but we are going to follow this recipe to make it easier. @@ -45,7 +45,7 @@ Let's do an exercise to explain better how backtracking works. // https://leetcode.com/problems/combination-sum/description/ -== Permutations +==== Permutations (((Permutations))) (((Words permutations))) > Return all the permutations (without repetitions) of a word. @@ -63,7 +63,7 @@ For instace, if you are given the word `art` these are the possible permutations Now, let's implement the program to generate all permutations of a word. -NOTE: We already solved this problem using an <>, now let's do it using backtracking. +NOTE: We already solved this problem using an <>, now let's do it using backtracking. .Word permutations using backtracking [source, javascript] @@ -80,7 +80,7 @@ As you can see, we iterate through each element and swap with the following lett In the following tree, you can visualize how the backtracking algorithm is swapping the letters. We are taking the `art` as an example. -[graphviz, Words Permutations, svg] +[graphviz, Words-Permutations, png] .... digraph g { node [shape = record,height=.1]; diff --git a/book/chapters/bubble-sort.adoc b/book/content/part04/bubble-sort.asc similarity index 85% rename from book/chapters/bubble-sort.adoc rename to book/content/part04/bubble-sort.asc index 007dda7a..f49ddac3 100644 --- a/book/chapters/bubble-sort.adoc +++ b/book/content/part04/bubble-sort.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Bubble Sort +==== Bubble Sort (((Bubble Sort))) (((Sorting, Bubble Sort))) (((Sinking Sort))) @@ -15,7 +15,7 @@ However, if the array is entirely out of order, it will require _O(n^2^)_ to sor (((Quadratic))) (((Runtime, Quadratic))) -== Bubble Sort Implementation +===== Bubble Sort Implementation .Bubble Sort implementation in JavaScript [source, javascript] @@ -66,15 +66,15 @@ console.log(b); //️↪️ 1 Without the destructuring assignment, swapping two values requires a temporary variable. **** -Bubble sort has a <> running time, as you might infer from the nested for-loop. +Bubble sort has a <> running time, as you might infer from the nested for-loop. -== Bubble Sort Properties +===== Bubble Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes, _O(n)_ when already sorted -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ indexterm:[Runtime, Quadratic] diff --git a/book/chapters/divide-and-conquer-fibonacci.adoc b/book/content/part04/divide-and-conquer.asc similarity index 61% rename from book/chapters/divide-and-conquer-fibonacci.adoc rename to book/content/part04/divide-and-conquer.asc index 07d99a3a..be80b106 100644 --- a/book/chapters/divide-and-conquer-fibonacci.adoc +++ b/book/content/part04/divide-and-conquer.asc @@ -1,9 +1,31 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Recursive Fibonacci Numbers +=== Divide and Conquer + +(((Divide and Conquer))) +(((Algorithmic Techniques, Divide and Conquer))) +Divide and conquer is a strategy for solving algorithmic problems. +It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. + +We have already implemented some algorithms using the divide and conquer technique. + +.Examples of divide and conquer algorithms: +- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. +- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. +- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. +- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. + +.In general, the divide and conquer algorithms have the following pattern: +1. *Divide* data into subproblems. +2. *Conquer* each subproblem. +3. *Combine* results. + +As you might know, there are multiple ways to solve a problem. Let's solve the Fibonacci numbers using a divide and conquer algorithm. Later we are going to provide a more performant solution using dynamic programming. + +==== Recursive Fibonacci Numbers (((Fibonacci))) To illustrate how we can solve a problem using divide and conquer, let's write a program to find the n-th Fibonacci number. @@ -32,7 +54,7 @@ The implementation above does the job, but what's the runtime? For that, let's take a look at the job performed calculating the `fib(5)` number. Since `fib(5) = fib(4) + fib(3)`, we need to find the answer for `fib(4)` and `fib(3)`. We do that recursively until we reach the base cases of `fib(1)` and `fib(0)`. If we represent the calls in a tree, we would have the following: // http://bit.ly/2UmwzZV -[graphviz, Recursive Fibonacci call tree, png] +[graphviz, recursive-fibonacci-call-tree, png] .... graph G { "fib(5)" -- { "fib(4)", "fib(3)" } @@ -70,3 +92,5 @@ In the call tree, you can notice that every element in red and with asterisks `* Those who cannot remember the past are condemned to repeat it. For these cases when subproblems repeat themselves, we can optimize them using <>. Let's do that in the next section. + + diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc new file mode 100644 index 00000000..411c6f45 --- /dev/null +++ b/book/content/part04/dynamic-programming.asc @@ -0,0 +1,62 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Dynamic Programming + +(((Dynamic Programming))) +(((Algorithmic Techniques, Dynamic Programming))) +Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. + +// https://twitter.com/amejiarosario/status/1103050924933726208 +// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson +// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 +// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem + +.How to explain dynamic programming to kids? 👶 +**** + +$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ + +--{sp} What's that equal to? + +--{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! + +--{sp} Add another "+1". What's the total now? + +--{sp} $$*$$*_Quickly_*$$*$$ Eleven! + +--{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." +**** + +==== Fibonacci Sequence with Dynamic Programming +(((Fibonacci))) +Let's solve the same Fibonacci problem but this time with dynamic programming. + +When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. + +.Recursive Fibonacci Implemenation using Dynamic Programming +[source, javascript] +---- +include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] +---- + +This implementation checks if we already calculated the value, if so it will save it for later use. + +[graphviz, Recursive-Fibonacci-call-tree-with-dp, png] +.... +graph G { + "fib(5)" -- { "fib(4)" } + "fib(4)" -- { "fib(3)" } + "fib(3)" -- { "fib(2)" } + "fib(2)" -- { "fib(1)", "fib(0)" } +} +.... + +This graph looks pretty linear now. It's runtime _O(n)_! +(((Linear))) +(((Runtime, Linear))) + +(((Memoization))) +TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/content/part04/greedy-algorithms.asc b/book/content/part04/greedy-algorithms.asc new file mode 100644 index 00000000..c28abd6e --- /dev/null +++ b/book/content/part04/greedy-algorithms.asc @@ -0,0 +1,105 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Greedy Algorithms + +(((Greedy Algorithms))) +(((Algorithmic Techniques, Greedy Algorithms))) +Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. +They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. + +An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. + +[graphviz, Find-the-largest-sum, png] +.... +graph G { + 5 -- 3 [color="#B8E986", penwidth=2] + 5 -- 7 [color="#FF5252", penwidth=2] + 3 -- 87 [color="#B8E986", penwidth=2] + 3 -- 1 + 7 -- 2 + 7 -- 4 [color="#FF5252", penwidth=2] + + label="Optimal vs. Greedy path" +} +.... + +Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. + +Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. + +[TIP] +======= +Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. +This algorithm only gives one shot at finding the solution and never goes back to consider other options. +======= + +Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. + +.Some examples of greedy algorithms that works well: +- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. +- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. +indexterm:[Merge Sort] + + +.In general, we can follow these steps to design Greedy Algorithms: +1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). +2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. +3. Reduce the processed input and repeat step #1 and #2 until all data is gone. +4. Return solution. +5. Check correctness with different examples and edge cases. + +==== Fractional Knapsack Problem + +We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: + +> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? + +Let's say we have the following items available. + +.Knpasack Input +[source, javascript] +---- +const items = [ + { value: 1, weight: 1}, + { value: 4, weight: 3 }, + { value: 5, weight: 4 }, + { value: 7, weight: 5 }, +]; + +const maxWeight = 7; +---- + +So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. + +How would you solve this problem? + +First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: + +- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. + +- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# + +- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# + +.Items value/weight ratio +---- + { value: 1, weight: 1 }, // 1/1 = 1 + { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ + { value: 5, weight: 4 }, // 5/4 = 1.25 + { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ +---- + +Let's implement this algorithm! + +.Factional Knapsack Problem Implementation +[source, javascript] +---- +include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] +---- + +What's the runtime of this algorithm? + +We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/chapters/insertion-sort.adoc b/book/content/part04/insertion-sort.asc similarity index 81% rename from book/chapters/insertion-sort.adoc rename to book/content/part04/insertion-sort.asc index c44c4c5e..c8bc818d 100644 --- a/book/chapters/insertion-sort.adoc +++ b/book/content/part04/insertion-sort.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Insertion Sort +[[insertion-sort]] +==== Insertion Sort (((Sorting, Insertion Sort))) (((Insertion Sort))) @@ -11,7 +12,7 @@ Insertion sort is a simple sorting algorithm. It is one of the most natural ways // Good illustration on of sorting a deck of cards: https://www.khanacademy.org/computing/computer-science/algorithms/insertion-sort/a/insertion-sort -== Insertion Sort Implementation +===== Insertion Sort Implementation Insertion sort does the following: It starts from the 2nd element, and it tries to find anything to the left that could be bigger than the current item. It will swap all the elements with higher value @@ -28,14 +29,14 @@ include::{codedir}/algorithms/sorting/insertion-sort.js[tag=sort, indent=0] <4> We check every element on the left side and swap any of them that are out of order -== Insertion Sort Properties +===== Insertion Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ (((Quadratic))) (((Runtime, Quadratic))) diff --git a/book/chapters/merge-sort.adoc b/book/content/part04/merge-sort.asc similarity index 82% rename from book/chapters/merge-sort.adoc rename to book/content/part04/merge-sort.asc index 91cb45b0..65e90f0d 100644 --- a/book/chapters/merge-sort.adoc +++ b/book/content/part04/merge-sort.asc @@ -1,19 +1,22 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Merge Sort +[[merge-sort]] +==== Merge Sort + (((Sorting, Merge Sort))) (((Merge Sort))) + Merge Sort is an efficient sorting algorithm that uses <> paradigm to accomplish its task faster. However, It uses auxiliary memory in the process of sorting. indexterm:[Divide and Conquer] Merge sort algorithm splits the array into halves until 2 or fewer elements are left. It sorts these two elements and then merges back all halves until the whole collection is sorted. -image:image11.png[Mergesort visualization,width=500,height=600] +image::image11.png[Mergesort visualization,width=500,height=600] -== Merge Sort Implementation +===== Merge Sort Implementation .Merge Sort implementation in JavaScript (mergeSort) [source, javascript] @@ -44,17 +47,17 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge, indent=0] <2> If `array1` current element (`i1`) has the lowest value, we insert it into the `mergedArray` if not we then insert `array2` element. <3> `mergedArray` is `array1` and `array2` combined in ascending order (sorted). -Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. +Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. -== Merge Sort Properties +===== Merge Sort Properties - <>: [big]#✅# Yes - <>: [big]#️❌# No, it requires auxiliary memory O(n). - <>: [big]#️❌# No, new elements will require to sort the whole array. - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - Recursive: Yes -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory +- Time Complexity: [big]#✅# <> _O(n log n)_ +- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory (((Linearithmic))) (((Runtime, Linearithmic))) diff --git a/book/chapters/quick-sort.adoc b/book/content/part04/quick-sort.asc similarity index 88% rename from book/chapters/quick-sort.adoc rename to book/content/part04/quick-sort.asc index b3bd1d3e..a2d0e32d 100644 --- a/book/chapters/quick-sort.adoc +++ b/book/content/part04/quick-sort.asc @@ -1,19 +1,20 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Quicksort +[[quicksort]] +==== Quicksort (((Sorting, QuickSort))) (((QuickSort))) Quicksort is an efficient recursive sorting algorithm that uses <> paradigm to sort faster. It can be implemented in-place, so it doesn't require additional memory. indexterm:[Divide and Conquer] -In practice, quicksort outperforms other sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. +In practice, quicksort outperforms other sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. Quicksort picks a "pivot" element (preferably random) and move all the parts that are smaller than the pivot to the right and the ones that are bigger to the left. It does this recursively until all the array is sorted. -== Quicksort Implementation +===== Quicksort Implementation Quicksort implementation uses the divide-and-conquer in the following way: @@ -72,17 +73,17 @@ And you can see the implementation of `shuffle` below: include::{codedir}/algorithms/sorting/sorting-common.js[tag=shuffle, indent=0] ---- -With the optimization, Quicksort has an _O(n log n)_ running time. Similar to the merge sort we divide the array into halves each time. For more details about how to extract the runtime go to <>. +With the optimization, Quicksort has an _O(n log n)_ running time. Similar to the merge sort we divide the array into halves each time. For more details about how to extract the runtime go to <>. -== Quicksort Properties +===== Quicksort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - <>: [big]#️❌# No, the pivot element can be choose at random. - Recursive: Yes -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#✅# <> _O(n log n)_ +- Space Complexity: [big]#✅# <> _O(1)_ (((Linearithmic))) (((Runtime, Linearithmic))) diff --git a/book/chapters/selection-sort.adoc b/book/content/part04/selection-sort.asc similarity index 78% rename from book/chapters/selection-sort.adoc rename to book/content/part04/selection-sort.asc index 1272254a..f4787e05 100644 --- a/book/chapters/selection-sort.adoc +++ b/book/content/part04/selection-sort.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Selection Sort +[[selection-sort]] +==== Selection Sort (((Sorting, Selection Sort))) (((Selection Sort))) @@ -14,9 +15,9 @@ The selection sort is a simple sorting algorithm. As its name indicates, it _sel . Find the minimum item in the rest of the array. If a new minimum is found swap them. . Repeat step #1 and #2 with the next element until the last one. -image:selection-sort.gif[] +image::selection-sort.gif[] -== Selection sort implementation +===== Selection sort implementation For implementing the selection sort, we need two indexes. .Selection sort @@ -35,14 +36,14 @@ TIP: Selection sort minimizes the number of swaps. It does one swap per iteratio One index is for the position in question (selection/left) and another one for finding the minimum in the rest of the array (right). -== Selection Sort Properties +===== Selection Sort Properties - <>: [big]#✅# Yes - <>: [big]#️️❌# No - <>: [big]#️️❌# No - <>: [big]#️️❌# No -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ *Why selection sort is not stable?* @@ -54,7 +55,7 @@ Initially, we select the first element `2a` and check if there's anything less t Now, we have: `1, 5, 2b, 2a`. There you have it, `2b` now comes before `2a`. -// CAUTION: In practice, selection sort performance is the worst compared <> and <>. The only advantage of selection sort is that it minimizes the number of swaps. In case, that swapping is expensive, then it could make sense to use this one over the others. +// CAUTION: In practice, selection sort performance is the worst compared <> and <>. The only advantage of selection sort is that it minimizes the number of swaps. In case, that swapping is expensive, then it could make sense to use this one over the others. (((Quadratic))) (((Runtime, Quadratic))) diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc new file mode 100644 index 00000000..878029ab --- /dev/null +++ b/book/content/part04/sorting-algorithms.asc @@ -0,0 +1,142 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Sorting Algorithms + +Sorting is one of the most common solutions when we want to extract some insights about a collection of data. +We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. + +.We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: +- <> +- <> +- <> + +.and then discuss efficient sorting algorithms _O(n log n)_ such as: +- <> +- <> + +Before we dive into the most well-known sorting algorithms, let's discuss the sorting properties. + +==== Sorting Properties + +Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. + +Sorting properties are stable, adaptive, online and in-place. Let's go one by one. + +===== Stable +(((Sorting, stable))) +An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. + +This especially useful when you want to sort on multiple phases. + +.Let's say you have the following data: +[source, javascript] +---- +const users = [ + { name: 'Bob', age: 32 }, + { name: 'Alice', age: 30 }, + { name: 'Don', age: 30 }, + { name: 'Charly', age: 32 }, +]; +---- + +.If you sort by `name` you would have: +[source, javascript] +---- +[ + { name: 'Alice', age: 30 }, + { name: 'Bob', age: 32 }, + { name: 'Charly', age: 32 }, + { name: 'Don', age: 30 }, +]; +---- + +Then, here comes the _critical_ part, if you sort by `age` you might get (at least two) different results. + +.If the sorting algorithm is *stable*; it should keep the items with the same age ordered by `name`: +[source, javascript] +---- +[ + { name: 'Alice', age: 30 }, + { name: 'Don', age: 30 }, + { name: 'Bob', age: 32 }, + { name: 'Charly', age: 32 }, +]; +---- + +.However, if the sorting is *not stable*, then you will lose the relative order of the items and get something like this: +[source, javascript] +---- +[ + { name: 'Don', age: 30 }, + { name: 'Alice', age: 30 }, + { name: 'Charly', age: 32 }, + { name: 'Bob', age: 32 }, +]; +---- + +Both results are sorted by `age`; however, having a stable sorting is better if you want to keep the relative position of data with the same value. + +===== In-place +(((Sorting, in-place))) +An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. +No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. + +===== Online +(((Sorting, online))) +It can sort a list as it receives it. +((Online sorting)) algorithms don't have to re-sort the whole collection for every new item added. + +===== Adaptive +(((Sorting, adaptive))) +Algorithms with ((adaptive sorting)) run faster, close to _O(n)_, on an already sorted (or partially sorted) collection. + +<<< +include::bubble-sort.asc[] + +<<< +include::insertion-sort.asc[] + +<<< +include::selection-sort.asc[] + +<<< +include::merge-sort.asc[] + +<<< +include::quick-sort.asc[] + +<<< +==== Summary + +We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. +(((Tables, Algorithms, Sorting Complexities))) +(((Tables, Algorithms, Sorting Summary))) + +// tag::table[] +.Sorting algorithms comparison +[cols="20,80"] +|=== +| Algorithms | Comments +| <> | Swap pairs bubbling up largest numbers to the right +| <> | Look for biggest number to the left and swap it with current +| <> | Iterate array looking for smallest value to the right +| <> | Split numbers in pairs, sort pairs and join them in ascending order +| <> | Choose a pivot, set smaller values to the left and bigger to the right. +// | Tim sort | Hybrid of merge sort and insertion sort +|=== + +.Sorting algorithms time/space complexity and properties +|=== +| Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive +| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes +| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes +| <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No +| <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No +| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No +// | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes +|=== +// end::table[] + diff --git a/book/chapters/preface.adoc b/book/content/preface.asc similarity index 85% rename from book/chapters/preface.adoc rename to book/content/preface.asc index 86222879..7f983404 100644 --- a/book/chapters/preface.adoc +++ b/book/content/preface.asc @@ -1,26 +1,26 @@ [preface] -= Preface +== Preface -== What is in this book? +=== What is in this book? -_{book-title}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or looking for ideas to solve a problem optimally. (Check out the <

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 literal 0 HcmV?d00001 diff --git a/book/images/recursive-fibonacci-call-tree.png b/book/images/recursive-fibonacci-call-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..9e18a2ab7e050308393102aa9cc8922d5c0a7baf GIT binary patch literal 52743 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%0Dq?o%c)^!oBrA2&6E*^ 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 Yr8BcFzjC?92nGJhN-9c}i5d9*KL_kY%m4rY literal 0 HcmV?d00001 diff --git a/book/index.asc b/book/index.asc new file mode 100644 index 00000000..4312be40 --- /dev/null +++ b/book/index.asc @@ -0,0 +1,5 @@ +[index] +[[index]] +== Index + +ifndef::backend-pdf[Topical index only available on the PDF version.] diff --git a/book/lab/greetings.pdf b/book/lab/greetings.pdf deleted file mode 100644 index fab4624f7ebc4a8bea88e0c4462e851531aa98d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10630 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 M5_m8g&A!ax59Y)4;{X5v diff --git a/book/part01-algorithms-analysis.asc b/book/part01-algorithms-analysis.asc new file mode 100644 index 00000000..aefd21c1 --- /dev/null +++ b/book/part01-algorithms-analysis.asc @@ -0,0 +1,12 @@ +[[part01-algorithms-analysis]] +== Algorithms Analysis + +In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. + +include::content/part01/algorithms-analysis.asc[] + +include::content/part01/big-o-examples.asc[] + +=== Summary + +Lorem ipsum dolor sit, amet consectetur adipisicing elit. Aut, optio harum. Rem assumenda iste est delectus quas corporis tenetur esse neque id officia expedita porro sit, totam rerum illo cupiditate. diff --git a/book/chapters/linear-data-structures-intro.adoc b/book/part02-linear-data-structures.asc similarity index 59% rename from book/chapters/linear-data-structures-intro.adoc rename to book/part02-linear-data-structures.asc index a9b5d3b3..ad0db79e 100644 --- a/book/chapters/linear-data-structures-intro.adoc +++ b/book/part02-linear-data-structures.asc @@ -1,16 +1,17 @@ -[partintro] --- +[[part02-linear-data-structures]] +== Linear Data Structures + Data Structures comes in many flavors. There’s no one to rule them all. You have to know the tradeoffs so you can choose the right one for the job. Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you how when to use over the other or even tweak them to create a new one. We are going to explore the most common data structures time and space complexity. .In this part we are going to learn about the following linear data structures: -- <> -- <> -- <> -- <> +- <> +- <> +- <> +- <> -Later, in the next part, we are going to explore non-linear data structures like <> and <>. +Later, in the next part, we are going to explore non-linear data structures like <> and <>. ifdef::backend-html5[] If you want to have a general overview of each one, take a look at the following interactive diagram: @@ -21,4 +22,18 @@ If you want to have a general overview of each one, take a look at the following +++ endif::[] --- +include::content/part02/array.asc[] + +<<< +include::content/part02/linked-list.asc[] + +<<< +include::content/part02/stack.asc[] + +<<< +include::content/part02/queue.asc[] + +<<< +include::content/part02/array-vs-list-vs-queue-vs-stack.asc[] + + diff --git a/book/part03-graph-data-structures.asc b/book/part03-graph-data-structures.asc new file mode 100644 index 00000000..baebfd0e --- /dev/null +++ b/book/part03-graph-data-structures.asc @@ -0,0 +1,38 @@ +[[part03-graph-data-structures]] +== Graph Data Structures + +Graph-based data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. + +.In this chapter we are going to learn: +- Exciting <> data structure applications +- Searching efficiently with a <> data structures. +- One of the most versatile data structure of all <>. +- Keeping dups out with a <>. +By the end of this section, you will know the data structures trade-offs and when to use one over the other. + +include::content/part03/tree-intro.asc[] + +<<< +include::content/part03/binary-search-tree.asc[] + +<<< +include::content/part03/tree-search-traversal.asc[] + +<<< +include::content/part03/binary-search-tree-traversal.asc[] + +<<< +include::content/part03/map.asc[] + +<<< +include::content/part03/set.asc[] + +<<< +include::content/part03/graph.asc[] + +<<< +include::content/part03/graph-search.asc[] + +<<< +include::content/part03/time-complexity-graph-data-structures.asc[] + diff --git a/book/chapters/algorithms-intro.adoc b/book/part04-algorithmic-toolbox.asc similarity index 73% rename from book/chapters/algorithms-intro.adoc rename to book/part04-algorithmic-toolbox.asc index d44ad6e6..81e4f476 100644 --- a/book/chapters/algorithms-intro.adoc +++ b/book/part04-algorithmic-toolbox.asc @@ -1,3 +1,6 @@ +[[part04-algorithmic-toolbox]] +== Algorithmic Toolbox + In this part of the book, we are going to cover examples of classical algorithms in more details. Also, we will provide algorithmic tools for improving your problem-solving skills. @@ -5,7 +8,7 @@ IMPORTANT: There's not a single approach to solve all problems but knowing well- We are going to start with <> // and searching algorithms, -such as <>, <> and some others. +such as <>, <> and some others. Later, you are going to learn some algorithmic paradigms that will help you to identify common patterns and solve problems from different angles. @@ -15,3 +18,22 @@ Later, you are going to learn some algorithmic paradigms that will help you to i - <>: _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. - <>: search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). + + +include::content/part04/sorting-algorithms.asc[] + +<<< +include::content/part04/divide-and-conquer.asc[] + +<<< +include::content/part04/dynamic-programming.asc[] + +<<< +include::content/part04/greedy-algorithms.asc[] + +<<< +include::content/part04/backtracking.asc[] + +<<< +include::content/part04/algorithmic-toolbox.asc[] + diff --git a/book/sample-o.adoc b/book/sample-o.adoc deleted file mode 100644 index 983c90fa..00000000 --- a/book/sample-o.adoc +++ /dev/null @@ -1,47 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia (g) -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -// ifndef::backend-epub3[:leveloffset: +1] -// include::chapters/dedication.adoc[] -// ifndef::backend-epub3[:leveloffset: -1] -include::chapters/dedication.adoc[] - -// (g) -include::chapters/preface.adoc[] - -// add sections to chapters -:sectnums: - - -//----------------------------------- -// TODO: commment out sample on final -//----------------------------------- - -include::chapters/sample.adoc[] - -//----------------------------------- -// TODO: end remove ------ -//----------------------------------- - - -// --- end algorithms --- - - -// -// end chapters -// -:sectnums!: - -include::chapters/epigraph.adoc[] - -[index] -= Index diff --git a/book/sample.adoc b/book/sample.adoc deleted file mode 100644 index cda039b7..00000000 --- a/book/sample.adoc +++ /dev/null @@ -1,70 +0,0 @@ -= Data Structures and Algorithms Explained in JavaScript -:book-title: {doctitle} -:author: Adrian Mejia -:email: hello+dsajs@adrianmejia.com -:revnumber: 1.0.0 -:revdate: {docdate} -:revyear: 2019 -:revremark: First Edition -:subject: Algorithms -:keywords: Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees -:doctype: book -:media: screen -:imagesdir: {docdir}/images -ifeval::["{media}" != "prepress"] -:front-cover-image: image:cover.png[Front Cover,1050,2600] -endif::[] -:toc: -:toclevels: 3 -:icons: font -:lang: en -:language: javascript -:experimental: -:pdf-fontsdir: ./fonts -:pdf-stylesdir: ./_resources/pdfstyles -:pdf-style: adrian-screen -:title-logo-image: image:logo.png[Logo,50,50] - -// custom variables -:codedir: ../../src -:datadir: {docdir}/data -:source-highlighter: pygments -:pygments-style: xcode - - -ifndef::ebook-format[:leveloffset: 1] - -[colophon#colophon%nonfacing] -include::chapters/colophon.adoc[] - -[dedication] -include::chapters/dedication.adoc[] - -// [%nonfacing] -// include::chapters/acknowledgements.adoc[] - -[preface] -include::chapters/preface.adoc[] - -// include::chapters/introduction.adoc[] - -include::chapters/chapter1.adoc[] - -include::chapters/sample.adoc[] - -// include::chapters/chapter2.adoc[] - -// include::chapters/chapter3.adoc[] - -// include::chapters/chapter4.adoc[] - -include::chapters/appendix.adoc[] - -// include::chapters/epigraph.adoc[] - -// include::chapters/about.adoc[] - -ifdef::backend-pdf,backend-docbook[] -[index] -= Index -endif::[] diff --git a/deprecated-README.adoc b/deprecated-README.adoc index 7c8d8136..f0ff9d83 100644 --- a/deprecated-README.adoc +++ b/deprecated-README.adoc @@ -3,8 +3,8 @@ :toclevels: 2 Adrian Mejia -image:https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] -image:https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] +image::https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] +image::https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] This repository covers the implementation of the classical algorithms and data structures in JavaScript. @@ -18,12 +18,12 @@ toc::[] - Algorithm analysis fundamentals (Big O notation, Time/Space complexity) and examples. - Time/space complexity cheatsheet. -image:book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] +image::book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] == Data Structures We are covering the following data structures. -image:https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] +image::https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] ### Linear Data Structures 1. **Arrays**: Built-in in most languages so not implemented here. https://adrianmejia.com/blog/2018/04/28/data-structures-time-complexity-for-beginners-arrays-hashmaps-linked-lists-stacks-queues-tutorial/#Array[Post]. diff --git a/package-lock.json b/package-lock.json index 109eacb4..d285e8d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.2.3", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -887,14 +887,12 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "fill-range": "^7.0.1" } }, "browser-process-hrtime": { @@ -1133,9 +1131,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, @@ -1743,9 +1741,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -1824,6 +1822,30 @@ "dev": true, "requires": { "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "expect": { @@ -1956,16 +1978,23 @@ } }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "to-regex-range": "^5.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "find-up": { @@ -2056,7 +2085,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2077,12 +2107,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2097,17 +2129,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2224,7 +2259,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2236,6 +2272,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2250,6 +2287,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2257,12 +2295,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2281,6 +2321,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2361,7 +2402,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2373,6 +2415,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2458,7 +2501,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2494,6 +2538,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2513,6 +2558,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2556,12 +2602,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2670,12 +2718,12 @@ "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" @@ -3049,13 +3097,10 @@ } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-path-cwd": { "version": "1.0.0", @@ -3715,9 +3760,9 @@ "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3938,9 +3983,9 @@ } }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "mem": { @@ -3986,6 +4031,19 @@ "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + } } }, "mime-db": { @@ -4118,6 +4176,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4652,9 +4716,9 @@ "dev": true }, "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -5872,13 +5936,13 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { diff --git a/package.json b/package.json index be0d9469..ef2c1365 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.2.3", + "version": "1.3.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -31,11 +31,17 @@ "dependencies": {}, "devDependencies": { "benchmark": "2.1.4", + "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", + "jest": "23.6.0", + "braces": ">=2.3.1", + "handlebars": ">=4.0.14", + "js-yaml": ">=3.13.1", + "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { From b1abab121a6263cc5ec0ce9ca1474f23ed6eb4d8 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 23 Jun 2019 18:41:51 -0400 Subject: [PATCH 002/200] Revert "build(book): optimize for different formats" This reverts commit d686bddbc3d885789be06d6a7b534bbf294efe10. --- .circleci/config.yml | 2 +- .gitignore | 15 +- README.md | 101 +++-- book/A-time-complexity-cheatsheet.asc | 39 -- book/book-all.adoc | 155 ++++++++ book/book-o.adoc | 194 ++++++++++ book/book.adoc | 84 ++++ book/ch02-git-basics-chapter.asc | 35 -- book/chapters/about.adoc | 1 + book/chapters/acknowledgements.adoc | 1 + book/chapters/action.adoc | 4 + .../algorithmic-toolbox.adoc} | 10 +- .../algorithms-analysis.adoc} | 32 +- .../algorithms-intro.adoc} | 24 +- book/chapters/appendix.adoc | 3 + .../part02/array.asc => chapters/array.adoc} | 32 +- book/chapters/avl-tree.adoc | 5 + .../backtracking.adoc} | 16 +- .../big-o-examples.adoc} | 107 +++--- .../bubble-sort.adoc} | 16 +- book/chapters/cheatsheet.adoc | 38 ++ .../colophon.asc => chapters/colophon.adoc} | 5 +- book/chapters/dedication.adoc | 5 + .../divide-and-conquer-fibonacci.adoc} | 32 +- book/chapters/divide-and-conquer-intro.adoc | 17 + book/chapters/divide-and-conquer.adoc | 9 + .../dynamic-programming-fibonacci.adoc | 35 ++ book/chapters/dynamic-programming-intro.adoc | 30 ++ .../dynamic-programming-knapsack-problem.adoc | 52 +++ book/chapters/dynamic-programming.adoc | 16 + book/chapters/epigraph.adoc | 4 + .../graph-search.adoc} | 66 ++-- .../part03/graph.asc => chapters/graph.adoc} | 55 ++- book/chapters/greedy-algorithms-intro.adoc | 50 +++ .../greedy-algorithms-knapsack-problem.adoc | 57 +++ book/chapters/greedy-algorithms.adoc | 9 + book/chapters/heap-sort.adoc | 7 + book/chapters/heap.adoc | 3 + book/chapters/index.adoc | 2 + .../insertion-selection-bubble-sort.adoc | 3 + .../insertion-sort.adoc} | 15 +- .../linear-data-structures-intro.adoc} | 31 +- .../linear-data-structures-outro.adoc} | 22 +- .../linked-list.adoc} | 63 ++- .../map-hashmap-vs-treemap.adoc} | 40 +- .../hashmap.asc => chapters/map-hashmap.adoc} | 29 +- book/chapters/map-intro.adoc | 26 ++ .../treemap.asc => chapters/map-treemap.adoc} | 13 +- book/chapters/map.adoc | 18 + .../merge-sort.adoc} | 21 +- .../non-linear-data-structures-intro.adoc | 12 + book/chapters/part1.adoc | 20 + book/chapters/part2.adoc | 29 ++ book/chapters/part3.adoc | 63 +++ book/chapters/part4.adoc | 62 +++ .../preface.asc => chapters/preface.adoc} | 16 +- .../part02/queue.asc => chapters/queue.adoc} | 17 +- .../quick-sort.adoc} | 19 +- book/chapters/red-black-tree.adoc | 3 + book/chapters/sample.adoc | 359 ++++++++++++++++++ .../selection-sort.adoc} | 19 +- .../part03/set.asc => chapters/set.adoc} | 33 +- book/chapters/sorting-intro.adoc | 20 + book/chapters/sorting-properties.adoc | 78 ++++ book/chapters/sorting-summary.adoc | 35 ++ .../part02/stack.asc => chapters/stack.adoc} | 19 +- book/chapters/timsort.adoc | 63 +++ .../tree-avl.adoc} | 25 +- .../tree-binary-search-tree.adoc} | 36 +- .../tree-binary-tree-traversal.adoc} | 12 +- .../tree-search.adoc} | 30 +- .../tree-self-balancing-rotations.adoc} | 35 +- .../tree-intro.asc => chapters/tree.adoc} | 47 ++- book/chapters/trie.adoc | 3 + book/config | 2 +- book/content/cover.png | Bin 114081 -> 0 bytes book/content/dedication.asc | 4 - book/content/introduction.asc | 59 --- .../time-complexity-graph-data-structures.asc | 25 -- book/content/part04/dynamic-programming.asc | 62 --- book/content/part04/greedy-algorithms.asc | 105 ----- book/content/part04/sorting-algorithms.asc | 142 ------- book/{images/cover-a42.png => cover.png} | Bin book/custom-variables.adoc | 2 + book/dsajs.asc | 65 ---- book/images/Find-the-largest-sum.png | Bin 16292 -> 0 bytes .../Recursive-Fibonacci-call-tree-with-dp.png | Bin 17827 -> 0 bytes book/images/Words-Permutations.png | Bin 47291 -> 0 bytes book/images/cover-a41.png | Bin 51986 -> 0 bytes book/images/cover.png | Bin 114081 -> 104354 bytes book/images/directed-graph.png | Bin 16746 -> 0 bytes book/images/recursive-fibonacci-call-tree.png | Bin 52743 -> 0 bytes book/index.asc | 5 - book/lab/greetings.pdf | Bin 0 -> 10630 bytes book/lab/prawn_test.rb | 6 + book/lab/prawn_view.rb | 37 ++ book/lab/test.pdf | Bin 0 -> 946 bytes book/part01-algorithms-analysis.asc | 12 - book/part03-graph-data-structures.asc | 38 -- book/sample-o.adoc | 47 +++ book/sample.adoc | 70 ++++ deprecated-README.adoc | 8 +- package-lock.json | 176 +++------ package.json | 8 +- 104 files changed, 2266 insertions(+), 1311 deletions(-) delete mode 100644 book/A-time-complexity-cheatsheet.asc create mode 100644 book/book-all.adoc create mode 100644 book/book-o.adoc create mode 100644 book/book.adoc delete mode 100644 book/ch02-git-basics-chapter.asc create mode 100644 book/chapters/about.adoc create mode 100644 book/chapters/acknowledgements.adoc create mode 100644 book/chapters/action.adoc rename book/{content/part04/algorithmic-toolbox.asc => chapters/algorithmic-toolbox.adoc} (90%) rename book/{content/part01/algorithms-analysis.asc => chapters/algorithms-analysis.adoc} (90%) rename book/{part04-algorithmic-toolbox.asc => chapters/algorithms-intro.adoc} (73%) create mode 100644 book/chapters/appendix.adoc rename book/{content/part02/array.asc => chapters/array.adoc} (94%) create mode 100644 book/chapters/avl-tree.adoc rename book/{content/part04/backtracking.asc => chapters/backtracking.adoc} (93%) rename book/{content/part01/big-o-examples.asc => chapters/big-o-examples.adoc} (82%) rename book/{content/part04/bubble-sort.asc => chapters/bubble-sort.adoc} (85%) create mode 100644 book/chapters/cheatsheet.adoc rename book/{content/colophon.asc => chapters/colophon.adoc} (87%) create mode 100644 book/chapters/dedication.adoc rename book/{content/part04/divide-and-conquer.asc => chapters/divide-and-conquer-fibonacci.adoc} (61%) create mode 100644 book/chapters/divide-and-conquer-intro.adoc create mode 100644 book/chapters/divide-and-conquer.adoc create mode 100644 book/chapters/dynamic-programming-fibonacci.adoc create mode 100644 book/chapters/dynamic-programming-intro.adoc create mode 100644 book/chapters/dynamic-programming-knapsack-problem.adoc create mode 100644 book/chapters/dynamic-programming.adoc create mode 100644 book/chapters/epigraph.adoc rename book/{content/part03/graph-search.asc => chapters/graph-search.adoc} (65%) rename book/{content/part03/graph.asc => chapters/graph.adoc} (91%) create mode 100644 book/chapters/greedy-algorithms-intro.adoc create mode 100644 book/chapters/greedy-algorithms-knapsack-problem.adoc create mode 100644 book/chapters/greedy-algorithms.adoc create mode 100644 book/chapters/heap-sort.adoc create mode 100644 book/chapters/heap.adoc create mode 100644 book/chapters/index.adoc create mode 100644 book/chapters/insertion-selection-bubble-sort.adoc rename book/{content/part04/insertion-sort.asc => chapters/insertion-sort.adoc} (81%) rename book/{part02-linear-data-structures.asc => chapters/linear-data-structures-intro.adoc} (59%) rename book/{content/part02/array-vs-list-vs-queue-vs-stack.asc => chapters/linear-data-structures-outro.adoc} (57%) rename book/{content/part02/linked-list.asc => chapters/linked-list.adoc} (89%) rename book/{content/part03/map.asc => chapters/map-hashmap-vs-treemap.adoc} (55%) rename book/{content/part03/hashmap.asc => chapters/map-hashmap.adoc} (95%) create mode 100644 book/chapters/map-intro.adoc rename book/{content/part03/treemap.asc => chapters/map-treemap.adoc} (94%) create mode 100644 book/chapters/map.adoc rename book/{content/part04/merge-sort.asc => chapters/merge-sort.adoc} (82%) create mode 100644 book/chapters/non-linear-data-structures-intro.adoc create mode 100644 book/chapters/part1.adoc create mode 100644 book/chapters/part2.adoc create mode 100644 book/chapters/part3.adoc create mode 100644 book/chapters/part4.adoc rename book/{content/preface.asc => chapters/preface.adoc} (85%) rename book/{content/part02/queue.asc => chapters/queue.adoc} (93%) rename book/{content/part04/quick-sort.asc => chapters/quick-sort.adoc} (88%) create mode 100644 book/chapters/red-black-tree.adoc create mode 100644 book/chapters/sample.adoc rename book/{content/part04/selection-sort.asc => chapters/selection-sort.adoc} (78%) rename book/{content/part03/set.asc => chapters/set.adoc} (91%) create mode 100644 book/chapters/sorting-intro.adoc create mode 100644 book/chapters/sorting-properties.adoc create mode 100644 book/chapters/sorting-summary.adoc rename book/{content/part02/stack.asc => chapters/stack.adoc} (91%) create mode 100644 book/chapters/timsort.adoc rename book/{C-AVL-tree.asc => chapters/tree-avl.adoc} (77%) rename book/{content/part03/binary-search-tree.asc => chapters/tree-binary-search-tree.adoc} (91%) rename book/{content/part03/binary-search-tree-traversal.asc => chapters/tree-binary-tree-traversal.adoc} (94%) rename book/{content/part03/tree-search-traversal.asc => chapters/tree-search.adoc} (84%) rename book/{B-self-balancing-binary-search-trees.asc => chapters/tree-self-balancing-rotations.adoc} (84%) rename book/{content/part03/tree-intro.asc => chapters/tree.adoc} (77%) create mode 100644 book/chapters/trie.adoc delete mode 100644 book/content/cover.png delete mode 100644 book/content/dedication.asc delete mode 100644 book/content/introduction.asc delete mode 100644 book/content/part03/time-complexity-graph-data-structures.asc delete mode 100644 book/content/part04/dynamic-programming.asc delete mode 100644 book/content/part04/greedy-algorithms.asc delete mode 100644 book/content/part04/sorting-algorithms.asc rename book/{images/cover-a42.png => cover.png} (100%) create mode 100644 book/custom-variables.adoc delete mode 100644 book/dsajs.asc delete mode 100644 book/images/Find-the-largest-sum.png delete mode 100644 book/images/Recursive-Fibonacci-call-tree-with-dp.png delete mode 100644 book/images/Words-Permutations.png delete mode 100644 book/images/cover-a41.png delete mode 100644 book/images/directed-graph.png delete mode 100644 book/images/recursive-fibonacci-call-tree.png delete mode 100644 book/index.asc create mode 100644 book/lab/greetings.pdf create mode 100644 book/lab/prawn_test.rb create mode 100644 book/lab/prawn_view.rb create mode 100644 book/lab/test.pdf delete mode 100644 book/part01-algorithms-analysis.asc delete mode 100644 book/part03-graph-data-structures.asc create mode 100644 book/sample-o.adoc create mode 100644 book/sample.adoc diff --git a/.circleci/config.yml b/.circleci/config.yml index a50b5c40..cd95bb19 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -104,7 +104,7 @@ jobs: # a collection of steps - run: name: generate PDF - command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" + command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" pdf - store_artifacts: path: book/dist diff --git a/.gitignore b/.gitignore index 363ed4fe..fedfe47e 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ local.properties # Ruby ###################### /.bundle/ +/Gemfile.lock ###################### # Package Files @@ -135,13 +136,13 @@ Desktop.ini # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/fonts . # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/images . ###################### -# Gemfile -# Gemfile.lock -# Makefile -# _conf -# _resources -# extensions -# fonts +Gemfile +Gemfile.lock +Makefile +_conf +_resources +extensions +fonts ###################### diff --git a/README.md b/README.md index 1d399c45..64c0d55a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![Slack](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) -> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. +> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the [npm package](https://www.npmjs.com/package/dsa.js). > In this repository, you can find the implementation of algorithms and data structures. They are implemented and explained in JavaScript. This material can be used as a reference manual for developers. You can refresh specific topics before an interview. Also, you can find ideas to solve problems more efficiently. @@ -21,8 +21,7 @@ https://img.shields.io/bundlephobia/min/dsa.js.svg - 16.7kB https://img.shields.io/github/repo-size/amejiarosario/dsa.js.svg - 98.1 MB --> -![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png) - +[![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png)](https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015) ## Table of Contents @@ -97,7 +96,7 @@ The topics are divided in 4 main categories as you can see below: _(You can click on the ⯈ to expand the topics)_ -### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part01-algorithms-analysis.asc) +### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part1.adoc) -- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/linked-list.asc): each data node has a link to the next (and +- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linked-list.adoc): each data node has a link to the next (and previous). [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js) | - [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/linked-list.asc#linked-list-complexity-vs-array-complexity) + [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/linked-list.adoc#linked-list-complexity-vs-array-complexity) -- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/queue.asc): data flows in a "first-in, first-out" (FIFO) manner. +- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/queue.adoc): data flows in a "first-in, first-out" (FIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/queues/queue.js) | - [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/queue.asc#queue-complexity) + [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/queue.adoc#queue-complexity) -- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/stack.asc): data flows in a "last-in, first-out" (LIFO) manner. +- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/stack.adoc): data flows in a "last-in, first-out" (LIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/stacks/stack.js) | - [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/stack.asc#stack-complexity) + [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/stack.adoc#stack-complexity) --- @@ -225,7 +224,7 @@ they take different time to complete. --- -#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/array-vs-list-vs-queue-vs-stack.asc) +#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linear-data-structures-outro.adoc) Use Arrays when… - You need to access data in random order fast (using an index). @@ -246,7 +245,7 @@ Use Linked Lists when: --- - #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part02-linear-data-structures.asc) + #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part2.adoc) Build any of these data structures from scratch: - [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/linked-lists/linked-list.js) @@ -258,7 +257,7 @@ Use Linked Lists when: -### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) +### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) @@ -271,13 +270,13 @@ Use Linked Lists when: --- -#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/map.asc) +#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map.adoc) Learn how to implement different types of Maps such as: -- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/hashmap.asc) -- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/treemap.asc) +- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap.adoc) +- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-treemap.adoc) -Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/time-complexity-graph-data-structures.asc): +Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap-vs-treemap.adoc): - `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. - `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. @@ -296,9 +295,9 @@ Also, [learn the difference between the different Maps implementations](https:// --- -#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) +#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) -##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/graph.asc) +##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/graph.adoc) Know all the graphs properties with many images and illustrations. @@ -309,9 +308,9 @@ Know all the graphs properties with many images and illustrations. parents, loops. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/graphs/graph.js) | - [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/graph.asc#graph-complexity) + [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/graph.adoc#graph-complexity) -#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/tree-intro.asc) +#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree.adoc) Learn all the different kinds of trees and its properties. @@ -322,29 +321,29 @@ Learn all the different kinds of trees and its properties. graph not a tree. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc) - **Binary Trees**: same as tree but only can have two children at most. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc#binary-tree) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc#binary-tree) - **Binary Search Trees** (BST): same as binary tree, but the nodes value keep this order `left < parent < right`. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/binary-search-tree.js) | - [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/binary-search-tree.asc#tree-complexity) + [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-binary-search-tree.adoc#tree-complexity) - **AVL Trees**: Self-balanced BST to maximize look up time. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/avl-tree.js) | - [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/C-AVL-tree.asc) + [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-avl.adoc) | - [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/B-self-balancing-binary-search-trees.asc) + [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-self-balancing-rotations.adoc) - **Red-Black Trees**: Self-balanced BST more loose than AVL to @@ -362,12 +361,12 @@ Learn all the different kinds of trees and its properties. --- -#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/binary-search-tree.asc) +#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-binary-search-tree.adoc) - Learn how to add/remove/update values in a tree: ![inserting node in a tree](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image36.png) -- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/B-self-balancing-binary-search-trees.asc) +- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-self-balancing-rotations.adoc) From unbalanced BST to balanced BST ``` @@ -384,7 +383,7 @@ From unbalanced BST to balanced BST -### ⚒ [Algorithmic Toolbox](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +### ⚒ [Algorithms Techniques](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part4.adoc) @@ -398,7 +397,7 @@ From unbalanced BST to balanced BST --- -#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) 1. Understand the problem 1. Build a simple example (no edge cases yet) @@ -408,7 +407,7 @@ From unbalanced BST to balanced BST 1. Write Code, yes, now you can code. 1. Test your written code -Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) --- @@ -420,34 +419,34 @@ Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and- --- -#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/sorting-algorithms.asc) +#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/sorting-intro.adoc) We are going to explore three basic sorting algorithms O(n2) which have low overhead: - Bubble Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/bubble-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/bubble-sort.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/bubble-sort.adoc) - Insertion Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/insertion-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/insertion-sort.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/insertion-sort.adoc) - Selection Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/selection-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/selection-sort.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/selection-sort.adoc) and then discuss efficient sorting algorithms O(n log n) such as: - Merge Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/merge-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/merge-sort.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/merge-sort.adoc) - Quick sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/quick-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/quick-sort.asc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/quick-sort.adoc) --- @@ -459,13 +458,13 @@ and then discuss efficient sorting algorithms O(n log n) such as: --- -#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithms-intro.adoc) We are going to discuss the following techniques for solving algorithms problems: -- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/bbook/content/part04/greedy-algorithms.asc): makes greedy choices using heuristics to find the best solution without looking back. -- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. -- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. -- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. +- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/greedy-algorithms.adoc): makes greedy choices using heuristics to find the best solution without looking back. +- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/dynamic-programming.adoc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. +- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/divide-and-conquer.adoc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. +- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/backtracking.adoc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). --- diff --git a/book/A-time-complexity-cheatsheet.asc b/book/A-time-complexity-cheatsheet.asc deleted file mode 100644 index 64400aaa..00000000 --- a/book/A-time-complexity-cheatsheet.asc +++ /dev/null @@ -1,39 +0,0 @@ -[appendix] -[[a-time-complexity-cheatsheet]] -== Cheatsheet - -This section summerize what we are going to cover in the rest of this book. - -=== Runtimes - -include::content/part01/big-o-examples.asc[tag=table] - -include::content/part01/algorithms-analysis.asc[tag=table] - -=== Linear Data Structures - -include::content/part02/array-vs-list-vs-queue-vs-stack.asc[tag=table] - -=== Trees and Maps Data Structures - -This section covers Binary Search Tree (BST) time complexity (Big O). - -include::content/part03/time-complexity-graph-data-structures.asc[tag=table] - -include::content/part03/graph.asc[tag=table] - -=== Sorting Algorithms - -include::content/part04/sorting-algorithms.asc[tag=table] - -// // https://algs4.cs.princeton.edu/cheatsheet/ -// // http://bigocheatsheet.com/ - -// // https://en.wikipedia.org/wiki/Timsort (Tim Peters) -// // https://bugs.python.org/file4451/timsort.txt -// // https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m - -// // https://en.wikipedia.org/wiki/Sorting_algorithm -// // http://sorting.at/ -// // https://www.toptal.com/developers/sorting-algorithms -// // https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/book-all.adoc b/book/book-all.adoc new file mode 100644 index 00000000..5c872247 --- /dev/null +++ b/book/book-all.adoc @@ -0,0 +1,155 @@ +include::_conf/variables.adoc[] + += {doctitle} + +// remove numbering from titles, and sub-titles e.g. 1.1 +:sectnums!: + +// Copyright © 2018 Adrian Mejia +include::chapters/colophon.adoc[] + +// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle +// but level-1 in PDF and HTML +ifndef::backend-epub3[:leveloffset: +1] +include::chapters/dedication.adoc[] +ifndef::backend-epub3[:leveloffset: -1] + +// TODO: pending +include::chapters/preface.adoc[] + +include::chapters/cheatsheet.adoc[] + +// add sections to chapters +:sectnums: + +// +// chapters +// + += Algorithms Analysis + +// TODO: pending +include::chapters/algorithms-analysis-intro.adoc[] + +:leveloffset: +1 + +include::chapters/algorithms-analysis.adoc[] + +include::chapters/big-o-examples.adoc[] + +:leveloffset: -1 + += Linear Data Structures + +include::chapters/linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +include::chapters/array.adoc[] + +include::chapters/linked-list.adoc[] + +include::chapters/stack.adoc[] + +include::chapters/queue.adoc[] + +:leveloffset: -1 + += Non-Linear Data Structures + +include::chapters/non-linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +include::chapters/tree.adoc[] + +include::chapters/binary-search-tree.adoc[] + +include::chapters/map.adoc[] + +include::chapters/set.adoc[] + +include::chapters/graph.adoc[] + + +:leveloffset: -1 + += Advanced Non-Linear Data Structures + +// TODO: pending +include::chapters/non-linear-data-structures-intro-advanced.adoc[] + +:leveloffset: +1 + +// TODO: pending +include::chapters/avl-tree.adoc[] + +// TODO: pending (optional) +// include::chapters/red-black-tree.adoc[] + +// TODO: pending +include::chapters/heap.adoc[] + +// TODO: (optional) pending +// include::chapters/trie.adoc[] + + +:leveloffset: -1 + += Algorithms + +// TODO: pending +include::chapters/algorithms-intro.adoc[] + +:leveloffset: +1 + +// TODO: pending +include::chapters/sorting-intro.adoc[] + +// +// Slow Sorting +// + +include::chapters/insertion-sort.adoc[] + +include::chapters/selection-sort.adoc[] + +include::chapters/bubble-sort.adoc[] + +// +// Fast Sorting +// + +include::chapters/merge-sort.adoc[] + +include::chapters/quick-sort.adoc[] + +// TODO: (optional) pending +// include::chapters/heap-sort.adoc[] + +// TODO: (optional) pending +// include::chapters/tim-sort.adoc[] + +// +// Searching +// + +// TODO: pending +include::chapters/graph-search.adoc[] + +:leveloffset: -1 + +// +// end chapters +// + +include::chapters/epigraph.adoc[] + +// TODO: (optional) pending +// include::chapters/appendix.adoc[] + +// TODO: (optional) pending +ifdef::backend-pdf[] +include::chapters/index.adoc[] +endif::[] + diff --git a/book/book-o.adoc b/book/book-o.adoc new file mode 100644 index 00000000..6fc2744b --- /dev/null +++ b/book/book-o.adoc @@ -0,0 +1,194 @@ +include::_conf/variables.adoc[] + += {doctitle} + +// remove numbering from titles, and sub-titles e.g. 1.1 +:sectnums!: + +// Copyright © 2018 Adrian Mejia (g) +include::chapters/colophon.adoc[] + +// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle +// but level-1 in PDF and HTML +ifndef::backend-epub3[:leveloffset: +1] +include::chapters/dedication.adoc[] +ifndef::backend-epub3[:leveloffset: -1] + +// (g) +include::chapters/preface.adoc[] + +// add sections to chapters +:sectnums: + + +//----------------------------------- +// TODO: commment out sample on final +//----------------------------------- + +include::chapters/sample.adoc[] + +//----------------------------------- +// TODO: end remove ------ +//----------------------------------- + +// +// chapters +// + += Algorithms Analysis + +include::chapters/algorithms-analysis-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::chapters/algorithms-analysis.adoc[] + +// (g) +include::chapters/big-o-examples.adoc[] + +:leveloffset: -1 + += Linear Data Structures + +// (g) +include::chapters/linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::chapters/array.adoc[] + +// (g) +include::chapters/linked-list.adoc[] + +// (g) +include::chapters/stack.adoc[] + +// (g) +include::chapters/queue.adoc[] + +// (g) +include::chapters/linear-data-structures-outro.adoc[] + +:leveloffset: -1 + + += Non-Linear Data Structures + +// (g) +include::chapters/non-linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::chapters/tree.adoc[] + + +// (g) +include::chapters/tree-binary-search-tree.adoc[] + +include::chapters/tree-search.adoc[] + +include::chapters/tree-self-balancing-rotations.adoc[] + +:leveloffset: +1 + +include::chapters/tree-avl.adoc[] + +:leveloffset: -1 + +// (g) +// include::chapters/map.adoc[] +include::chapters/map-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::chapters/map-hashmap.adoc[] + +// (g) +include::chapters/map-treemap.adoc[] + +// (g) +include::chapters/map-hashmap-vs-treemap.adoc[] + +:leveloffset: -1 + +// (g) +include::chapters/set.adoc[] + +// (g) +include::chapters/graph.adoc[] + +// TODO: pending +include::chapters/graph-search.adoc[] + +:leveloffset: -1 + += Algorithmic Techniques + +// TODO: pending +include::chapters/algorithms-intro.adoc[] + +:leveloffset: +1 + +// +// Sorting algorithms +// += Sorting Algorithms + +:leveloffset: +1 + +// TODO: pending +include::chapters/sorting-intro.adoc[] + +// Slow Sorting + +include::chapters/insertion-sort.adoc[] + +include::chapters/selection-sort.adoc[] + +include::chapters/bubble-sort.adoc[] + +// Fast Sorting + +include::chapters/merge-sort.adoc[] + +include::chapters/quick-sort.adoc[] + +:leveloffset: -1 + + +// +// Algorithms Techniques +// + +include::chapters/divide-and-conquer.adoc[] + +include::chapters/dynamic-programming.adoc[] + +include::chapters/greedy-algorithms.adoc[] + +include::chapters/backtracking.adoc[] + +// --- end algorithms --- + +:leveloffset: -1 + +:sectnums!: + += Appendix + +:leveloffset: +1 + +// TODO: review and complete when the rest is completed +include::chapters/cheatsheet.adoc[] + +:leveloffset: -1 + +// +// end chapters +// + +include::chapters/epigraph.adoc[] diff --git a/book/book.adoc b/book/book.adoc new file mode 100644 index 00000000..4e0ad075 --- /dev/null +++ b/book/book.adoc @@ -0,0 +1,84 @@ += Data Structures and Algorithms in JavaScript +:book-title: {doctitle} +:author: Adrian Mejia +:email: hello+dsajs@adrianmejia.com +:revnumber: 1.0.0 +:revdate: {docdate} +:revyear: 2019 +:revremark: First Edition +:subject: Algorithms +:keywords: dsa.js, Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees +:doctype: book +:media: screen +ifeval::["{media}" != "prepress"] +:front-cover-image: image:cover-a4.png[Front Cover,595,842] +endif::[] +:toc: +:toclevels: 3 +:icons: font +:lang: en +:language: javascript +:experimental: +:pdf-fontsdir: ./fonts +:pdf-stylesdir: ./_resources/pdfstyles +:pdf-style: adrian-screen +:title-logo-image: image:logo.png[Logo,50,50] +// custom variables +:imagesdir: {docdir}/images +:codedir: ../../src +:datadir: {docdir}/data +// :source-highlighter: pygments +// paraiso-light, xcode, monokai +// :pygments-style: xcode +:stem: +:plantuml-config: {docdir}/_conf/umlconfig.txt +// :hide-uri-scheme: +// :chapter-label: Chapter +// :appendix-caption: Appendix +// :chapter-label: +// dark +// :pygments-style: monokai +// light theme with colorful code +// solarized-light, tomorrow +// :source-highlighter: highlightjs +// :highlightjs-theme: tomorrow + +ifndef::ebook-format[:leveloffset: 1] + +[colophon#colophon%nonfacing] +include::chapters/colophon.adoc[] + +[dedication] +include::chapters/dedication.adoc[] + +// [%nonfacing] +// include::chapters/acknowledgements.adoc[] + +[preface] +include::chapters/preface.adoc[] + +// include::chapters/introduction.adoc[] + +// TODO: (optional) include numbers but need to fix the part/chapter labels +// :sectnums: + +include::chapters/part1.adoc[] + +include::chapters/part2.adoc[] + +include::chapters/part3.adoc[] + +include::chapters/part4.adoc[] + +// :sectnums!: + +include::chapters/appendix.adoc[] + +// include::chapters/epigraph.adoc[] + +// include::chapters/about.adoc[] + +ifdef::backend-pdf,backend-docbook[] +[index] += Index +endif::[] diff --git a/book/ch02-git-basics-chapter.asc b/book/ch02-git-basics-chapter.asc deleted file mode 100644 index cb91537b..00000000 --- a/book/ch02-git-basics-chapter.asc +++ /dev/null @@ -1,35 +0,0 @@ -[[ch02-git-basics-chapter]] -== Git Basics - -If you can read only one chapter to get going with Git, this is it. -This chapter covers every basic command you need to do the vast majority of the things you'll eventually spend your time doing with Git. -By the end of the chapter, you should be able to configure and initialize a repository, begin and stop tracking files, and stage and commit changes. -We'll also show you how to set up Git to ignore certain files and file patterns, how to undo mistakes quickly and easily, how to browse the history of your project and view changes between commits, and how to push and pull from remote repositories. - -[[links]] -=== Links - -.Links to DSA -- Chapter: <> -- Section: <> - -// In <> we used it to specify our name, email address and editor preference before we even got started using Git. - -[source,console] ----- -$ git commit ----- - -Doing so launches your editor of choice. -(This is set by your shell's `EDITOR` environment variable -- usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in - -// <>).(((editor, changing default)))(((git commands, config))) - - - - - -=== Summary - -At this point, you can do all the basic local Git operations -- creating or cloning a repository, making changes, staging and committing those changes, and viewing the history of all the changes the repository has been through. -Next, we'll cover Git's killer feature: its branching model. diff --git a/book/chapters/about.adoc b/book/chapters/about.adoc new file mode 100644 index 00000000..73d625c5 --- /dev/null +++ b/book/chapters/about.adoc @@ -0,0 +1 @@ += About the author diff --git a/book/chapters/acknowledgements.adoc b/book/chapters/acknowledgements.adoc new file mode 100644 index 00000000..37ecc759 --- /dev/null +++ b/book/chapters/acknowledgements.adoc @@ -0,0 +1 @@ += Acknowledgements diff --git a/book/chapters/action.adoc b/book/chapters/action.adoc new file mode 100644 index 00000000..1e88adb2 --- /dev/null +++ b/book/chapters/action.adoc @@ -0,0 +1,4 @@ +[[action]] += Action! + +== Additional reading diff --git a/book/content/part04/algorithmic-toolbox.asc b/book/chapters/algorithmic-toolbox.adoc similarity index 90% rename from book/content/part04/algorithmic-toolbox.asc rename to book/chapters/algorithmic-toolbox.adoc index 467d5180..b9041c5a 100644 --- a/book/content/part04/algorithmic-toolbox.asc +++ b/book/chapters/algorithmic-toolbox.adoc @@ -1,10 +1,4 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -[[algorithms-toolbox]] -=== Algorithmic Toolbox += Algorithmic Toolbox Have you ever given a programming problem and freeze without knowing where to start? Well, in this section we are going to give some tips, so you don't get stuck while coding. @@ -23,7 +17,7 @@ TIP: TL;DR: Don't start coding right away. First, solve the problem, then write .. If anything else fails, how would you solve it the dumbest way possible (brute force). We can optimize it later. . *Test* your algorithm idea with multiple examples . *Optimize* the solution –Only optimize when you have something working don't try to do both at the same time! -.. Can you trade-off space for speed? Use a <> to speed up results! +.. Can you trade-off space for speed? Use a <> to speed up results! .. Do you have a bunch of recursive and overlapping problems? Try <>. .. Re-read requirements and see if you can take advantage of anything. E.g. is the array sorted? . *Write Code*, yes, now you can code. diff --git a/book/content/part01/algorithms-analysis.asc b/book/chapters/algorithms-analysis.adoc similarity index 90% rename from book/content/part01/algorithms-analysis.asc rename to book/chapters/algorithms-analysis.adoc index fab397fe..38361721 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/chapters/algorithms-analysis.adoc @@ -1,16 +1,16 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -=== Fundamentals of Algorithms Analysis += Fundamentals of Algorithms Analysis Probably you are reading this book because you want to write better and faster code. How can you do that? Can you time how long it takes to run a program? Of course, you can! [big]#⏱# However, if you run the same program on a smartwatch, cellphone or desktop computer, it will take different times. -image::image3.png[image,width=528,height=137] +image:image3.png[image,width=528,height=137] Wouldn't it be great if we can compare algorithms regardless of the hardware where we run them? That's what *time complexity* is for! @@ -24,7 +24,7 @@ We could also compare the memory "used" by different algorithms, and we called t Before going deeper into space and time complexity, let's cover the basics real quick. -==== What are Algorithms? +== What are Algorithms? Algorithms (as you might know) are steps of how to do some tasks. When you cook, you follow a recipe (or an algorithm) to prepare a dish. Let's say you want to make a pizza. @@ -47,7 +47,7 @@ If you play a game, you are devising strategies (or algorithms) to help you win. TIP: Algorithms are instructions on how to perform a task. -==== Comparing Algorithms +== Comparing Algorithms (((Comparing Algorithms))) Not all algorithms are created equal. There are “good” and “bad” algorithms. The good ones are fast; the bad ones are slow. Slow algorithms cost more money to run. Inefficient algorithms could make some calculations impossible in our lifespan! @@ -65,18 +65,18 @@ To give you a clearer picture of how different algorithms perform as the input s |Find all permutations of a string |4 sec. |> vigintillion years |> centillion years |∞ |∞ |============================================================================================= -Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. +Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. -From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. +From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. Organizing 1 million elements with merge sort takes 20 seconds while bubble sort takes 12 days, ouch! The amazing thing is that both programs are solving the same problem with equal data and hardware; and yet, there's a big difference in time! After completing this book, you are going to _think algorithmically_. You will be able to scale your programs while you are designing them. -Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# +Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# <<< -==== Increasing your code performance +== Increasing your code performance The first step to improve your code performance is to measure it. As somebody said: @@ -86,14 +86,14 @@ Measurement is the first step that leads to control and eventually to improvemen In this section, we are going to learn the basics of measuring our current code performance and compare it with other algorithms. -===== Calculating Time Complexity +=== Calculating Time Complexity (((Time complexity))) Time complexity, in computer science, is a function that describes the number of operations a program will execute given the size of the input `n`. How do you get a function that gives you the number of operations that will be executed? Well, we count line by line and mind code inside loops. Let's do an example to explain this point. For instance, we have a function to find the minimum value on an array called `getMin`. .Translating lines of code to an approximate number of operations -image::image4.png[Operations per line] +image:image4.png[Operations per line] Assuming that each line of code is an operation, we get the following: @@ -103,13 +103,13 @@ _3n + 3_ That means that if you have an array of 3 elements e.g. `getMin([3, 2, 9])`, then it will execute around _3(3)+3 = 12_ operations. Of course, this is not for every case. For instance, Line 12 is only executed if the condition on line 11 is met. As you might learn in the next section, we want to get the big picture and get rid of smaller terms to compare algorithms easier. -==== Space Complexity +== Space Complexity (((Space Complexity))) Space complexity is similar to time complexity. However, instead of the count of operations executed, it will account for the amount of memory used additionally to the input. For calculating the *space complexity* we keep track of the “variables” and memory used. In the `getMin` example, we just create a single variable called `min`. So, the space complexity is 1. On other algorithms, If we have to use an auxiliary array, then the space complexity would be `n`. -===== Simplifying Complexity with Asymptotic Analysis +=== Simplifying Complexity with Asymptotic Analysis (((Asymptotic Analysis))) When we are comparing algorithms, we don't want to have complex expressions. What would you prefer comparing two algorithms like "3n^2^ + 7n" vs. "1000 n + 2000" or compare them as "n^2^ vs. n"? Well, that when the asymptotic analysis comes to the rescue. @@ -129,7 +129,7 @@ In the previous example, we analyzed `getMin` with an array of size 3; what happ As the input size `n` grows bigger and bigger then the expression _3n + 3_ is closer and closer to _3n_. Dropping terms might look like a stretch at first, but you will see that what matters the most is the higher order terms of the function rather than lesser terms and constants. -===== What is Big O Notation? +=== What is Big O Notation? (((Big O))) There’s a notation called *Big O*, where `O` refers to the *order of the function*. @@ -176,7 +176,7 @@ This just an illustration since in different hardware the times will be slightly NOTE: These times are under the assumption of running on 1 GHz CPU and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. Regardless, bad algorithms would perform poorly even on a supercomputer. -==== Summary +== Summary In this chapter, we learned how you could measure your algorithm performance using time complexity. Rather than timing how long your program takes to run you can approximate the number of operations it will perform based on the input size. diff --git a/book/part04-algorithmic-toolbox.asc b/book/chapters/algorithms-intro.adoc similarity index 73% rename from book/part04-algorithmic-toolbox.asc rename to book/chapters/algorithms-intro.adoc index 81e4f476..d44ad6e6 100644 --- a/book/part04-algorithmic-toolbox.asc +++ b/book/chapters/algorithms-intro.adoc @@ -1,6 +1,3 @@ -[[part04-algorithmic-toolbox]] -== Algorithmic Toolbox - In this part of the book, we are going to cover examples of classical algorithms in more details. Also, we will provide algorithmic tools for improving your problem-solving skills. @@ -8,7 +5,7 @@ IMPORTANT: There's not a single approach to solve all problems but knowing well- We are going to start with <> // and searching algorithms, -such as <>, <> and some others. +such as <>, <> and some others. Later, you are going to learn some algorithmic paradigms that will help you to identify common patterns and solve problems from different angles. @@ -18,22 +15,3 @@ Later, you are going to learn some algorithmic paradigms that will help you to i - <>: _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. - <>: search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). - - -include::content/part04/sorting-algorithms.asc[] - -<<< -include::content/part04/divide-and-conquer.asc[] - -<<< -include::content/part04/dynamic-programming.asc[] - -<<< -include::content/part04/greedy-algorithms.asc[] - -<<< -include::content/part04/backtracking.asc[] - -<<< -include::content/part04/algorithmic-toolbox.asc[] - diff --git a/book/chapters/appendix.adoc b/book/chapters/appendix.adoc new file mode 100644 index 00000000..50074282 --- /dev/null +++ b/book/chapters/appendix.adoc @@ -0,0 +1,3 @@ +// Appendix A: +include::cheatsheet.adoc[] + diff --git a/book/content/part02/array.asc b/book/chapters/array.adoc similarity index 94% rename from book/content/part02/array.asc rename to book/chapters/array.adoc index 41bd6ef3..4d89ddda 100644 --- a/book/content/part02/array.asc +++ b/book/chapters/array.adoc @@ -1,15 +1,14 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[array]] -=== Array += Array (((Array))) (((Data Structures, Linear, Array))) Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. -==== Array Basics +== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. @@ -23,11 +22,11 @@ Some programming languages have fixed size arrays like Java and C++. Fixed size Arrays look like this: .Array representation: each value is accessed through an index. -image::image16.png[image,width=388,height=110] +image:image16.png[image,width=388,height=110] Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. -==== Insertion +== Insertion Arrays are built-in into most languages. Inserting an element is simple; you can either add them on creation time or after initialization. Below you can find an example for both cases: @@ -55,7 +54,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] The runtime for inserting elements using index is always is constant: _O(1)_. -===== Inserting at the beginning of the array +=== Inserting at the beginning of the array What if you want to insert a new element at the beginning of the array? You would have to push every item to the right. @@ -76,7 +75,7 @@ The `unshift()` method adds one or more elements to the beginning of an array an Runtime: O(n). **** -===== Inserting at the middle of the array +=== Inserting at the middle of the array Inserting a new element in the middle involves moving part of the array but not all of the items. @@ -98,7 +97,7 @@ The `splice()` method changes the contents of an array by removing existing elem Runtime: O(n). **** -===== Inserting at the end of the array +=== Inserting at the end of the array We can push new values to the end of the array like this: @@ -120,8 +119,7 @@ The `push()` method adds one or more elements to the end of an array and returns Runtime: O(1). **** -[[array-search-by-value]] -==== Searching by value and index +== Searching by value and index Searching by index is very easy using the `[]` operator: @@ -182,11 +180,11 @@ function searchByValue(array, value) { We would have to loop through the whole array (worst case) or until we find it: *O(n)*. -==== Deletion +== Deletion Deleting (similar to insertion) there are three possible scenarios, removing at the beginning, middle or end. -===== Deleting element from the beginning +=== Deleting element from the beginning Deleting from the beginning can be done using the `splice` function and also the `shift`. For simplicity, we will use the latter. @@ -209,7 +207,7 @@ The `shift()` method shift all elements to the left. In turn, it removes the fir Runtime: O(n). **** -===== Deleting element from the middle +=== Deleting element from the middle We can use the `splice` method for deleting an item from the middle of an array. @@ -225,7 +223,7 @@ array.splice(2, 1); // ↪️[2] <1> Deleting from the middle might cause most the elements of the array to move back one position to fill in for the eliminated item. Thus, runtime: O(n). -===== Deleting element from the end +=== Deleting element from the end Removing the last element is very straightforward: @@ -246,7 +244,7 @@ The `pop()` method removes the last element from an array and returns that eleme Runtime: O(1). **** -==== Array Complexity +== Array Complexity To sum up, the time complexity of an array is: (((Tables, Linear DS, Array Complexities))) diff --git a/book/chapters/avl-tree.adoc b/book/chapters/avl-tree.adoc new file mode 100644 index 00000000..569c30df --- /dev/null +++ b/book/chapters/avl-tree.adoc @@ -0,0 +1,5 @@ += AVL Tree + +The AVL tree builds on top of a <> and it keeps it balanced on insertions. It prevents a BST worst case scenario when the tree is totally unbalanced to one side (similar to linked list), then it takes O(n) to find an element instead of O(log n). + + diff --git a/book/content/part04/backtracking.asc b/book/chapters/backtracking.adoc similarity index 93% rename from book/content/part04/backtracking.asc rename to book/chapters/backtracking.adoc index 7faaf9f1..ee58db8a 100644 --- a/book/content/part04/backtracking.asc +++ b/book/chapters/backtracking.adoc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -=== Backtracking += Backtracking (((Backtracking))) (((Algorithmic Techniques, Backtracking))) Backtracking algorithms are used to find *all (or some)* solutions that satisfy a constraint. @@ -15,7 +15,7 @@ it stops and steps back (backtracks) to try another alternative. Some examples that use backtracking is a solving Sudoku/crosswords puzzle, and graph operations. ifndef::backend-pdf[] -image::Sudoku_solved_by_bactracking.gif[] +image:Sudoku_solved_by_bactracking.gif[] endif::backend-pdf[] Listing all possible solutions might sound like a brute force. @@ -30,7 +30,7 @@ It stops evaluating a path as soon as some of the conditions are broken and move However, it can only be applied if a quick test can be run to tell if a candidate will contribute to a valid solution. **** -==== How to develop backtracking algorithms? +== How to develop backtracking algorithms? Backtracking algorithms can be tricky to get right or reason about, but we are going to follow this recipe to make it easier. @@ -45,7 +45,7 @@ Let's do an exercise to explain better how backtracking works. // https://leetcode.com/problems/combination-sum/description/ -==== Permutations +== Permutations (((Permutations))) (((Words permutations))) > Return all the permutations (without repetitions) of a word. @@ -63,7 +63,7 @@ For instace, if you are given the word `art` these are the possible permutations Now, let's implement the program to generate all permutations of a word. -NOTE: We already solved this problem using an <>, now let's do it using backtracking. +NOTE: We already solved this problem using an <>, now let's do it using backtracking. .Word permutations using backtracking [source, javascript] @@ -80,7 +80,7 @@ As you can see, we iterate through each element and swap with the following lett In the following tree, you can visualize how the backtracking algorithm is swapping the letters. We are taking the `art` as an example. -[graphviz, Words-Permutations, png] +[graphviz, Words Permutations, svg] .... digraph g { node [shape = record,height=.1]; diff --git a/book/content/part01/big-o-examples.asc b/book/chapters/big-o-examples.adoc similarity index 82% rename from book/content/part01/big-o-examples.asc rename to book/chapters/big-o-examples.adoc index 38cb3ba5..171553b1 100644 --- a/book/content/part01/big-o-examples.asc +++ b/book/chapters/big-o-examples.adoc @@ -1,13 +1,14 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -=== Big O examples += Big O examples +// = Eight Running Times You Should Know There are many kinds of algorithms. Most of them fall into one of the eight of the time complexities that we are going to explore in this chapter. -.Eight Running Time complexity You Should Know +.Most common time complexities - Constant time: _O(1)_ - Logarithmic time: _O(log n)_ - Linear time: _O(n)_ @@ -22,18 +23,17 @@ We a going to provide examples for each one of them. Before we dive in, here’s a plot with all of them. .CPU operations vs. Algorithm runtime as the input size grows -image::image5.png[CPU time needed vs. Algorithm runtime as the input size increases] +image:image5.png[CPU time needed vs. Algorithm runtime as the input size increases] The above chart shows how the running time of an algorithm is related to the amount of work the CPU has to perform. As you can see O(1) and O(log n) are very scalable. However, O(n^2^) and worst can make your computer run for years [big]#😵# on large datasets. We are going to give some examples so you can identify each one. -[[constant]] -==== Constant +== Constant (((Constant))) (((Runtime, Constant))) Represented as *O(1)*, it means that regardless of the input size the number of operations executed is always the same. Let’s see an example. [#constant-example] -===== Finding if an array is empty +=== Finding if an array is empty Let's implement a function that finds out if an array is empty or not. @@ -45,19 +45,18 @@ Let's implement a function that finds out if an array is empty or not. include::{codedir}/runtimes/01-is-empty.js[tag=isEmpty] ---- -Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. +Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performance than this! -[[logarithmic]] -==== Logarithmic +== Logarithmic (((Logarithmic))) (((Runtime, Logarithmic))) Represented in Big O notation as *O(log n)*, when an algorithm has this running time it means that as the size of the input grows the number of operations grows very slowly. Logarithmic algorithms are very scalable. One example is the *binary search*. indexterm:[Runtime, Logarithmic] -[[logarithmic-example]] -===== Searching on a sorted array +[#logarithmic-example] +=== Searching on a sorted array The binary search only works for sorted lists. It starts searching for an element on the middle of the array and then it moves to the right or left depending if the value you are looking for is bigger or smaller. @@ -72,14 +71,13 @@ This binary search implementation is a recursive algorithm, which means that the Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. -[[linear]] -==== Linear +== Linear (((Linear))) (((Runtime, Linear))) Linear algorithms are one of the most common runtimes. It’s represented as *O(n)*. Usually, an algorithm has a linear running time when it iterates over all the elements in the input. -[[linear-example]] -===== Finding duplicates in an array using a map +[#linear-example] +=== Finding duplicates in an array using a map Let’s say that we want to find duplicate elements in an array. What’s the first implementation that comes to mind? Check out this implementation: @@ -99,14 +97,13 @@ As we learned before, the big O cares about the worst-case scenario, where we wo Space complexity is also *O(n)* since we are using an auxiliary data structure. We have a map that in the worst case (no duplicates) it will hold every word. -[[linearithmic]] -==== Linearithmic +== Linearithmic (((Linearithmic))) (((Runtime, Linearithmic))) An algorithm with a linearithmic runtime is represented as _O(n log n)_. This one is important because it is the best runtime for sorting! Let’s see the merge-sort. -[[linearithmic-example]] -===== Sorting elements in an array +[#linearithmic-example] +=== Sorting elements in an array The ((Merge Sort)), like its name indicates, has two functions merge and sort. Let’s start with the sort function: @@ -132,22 +129,21 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge] The merge function combines two sorted arrays in ascending order. Let’s say that we want to sort the array `[9, 2, 5, 1, 7, 6]`. In the following illustration, you can see what each function does. .Mergesort visualization. Shows the split, sort and merge steps -image::image11.png[Mergesort visualization,width=500,height=600] +image:image11.png[Mergesort visualization,width=500,height=600] How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work we have *O(n log n)*. There more formal ways to reach to this runtime like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. -[[quadratic]] -==== Quadratic +== Quadratic (((Quadratic))) (((Runtime, Quadratic))) Running times that are quadratic, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. Usually, they have double-nested loops that where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. -[[quadratic-example]] -===== Finding duplicates in an array (naïve approach) +[#quadratic-example] +=== Finding duplicates in an array (naïve approach) -If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: +If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: // image:image12.png[image,width=527,height=389] @@ -159,16 +155,15 @@ include::{codedir}/runtimes/05-has-duplicates-naive.js[tag=hasDuplicates] As you can see, we have two nested loops causing the running time to be quadratic. How much different is a linear vs. quadratic algorithm? -Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# +Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# -[[cubic]] -==== Cubic +== Cubic (((Cubic))) (((Runtime, Cubic))) Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. As an example of a cubic algorithm is a multi-variable equation solver (using brute force): -[[cubic-example]] -===== Solving a multi-variable equation +[#cubic-example] +=== Solving a multi-variable equation Let’s say we want to find the solution for this multi-variable equation: @@ -188,16 +183,15 @@ WARNING: This just an example, there are better ways to solve multi-variable equ As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we can refer as a *polynomial runtime*. -[[exponential]] -==== Exponential +== Exponential (((Exponential))) (((Runtime, Exponential))) Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish on your lifetime. [big]#💀# Let’s do an example. -[[exponential-example]] -===== Finding subsets of a set +[#exponential-example] +=== Finding subsets of a set Finding all distinct subsets of a given set can be implemented as follows: @@ -219,8 +213,7 @@ include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] Every time the input grows by one the resulting array doubles. That’s why it has an *O(2^n^)*. -[[factorial]] -==== Factorial +== Factorial (((Factorial))) (((Runtime, Factorial))) Factorial runtime, O(n!), is not scalable at all. Even with input sizes of ~10 elements, it will take a couple of seconds to compute. It’s that slow! [big]*🍯🐝* @@ -236,8 +229,8 @@ A factorial is the multiplication of all the numbers less than itself down to 1. - 11! = 39,916,800 **** -[[factorial-example]] -===== Getting all permutations of a word +[#factorial-example] +=== Getting all permutations of a word (((Permutations))) (((Words permutations))) One classic example of an _O(n!)_ algorithm is finding all the different words that can be formed with a given set of letters. @@ -254,7 +247,7 @@ As you can see in the `getPermutations` function, the resulting array is the fac Factorial start very slow and then it quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! [big]*🤯* -==== Summary +== Summary We went through 8 of the most common time complexities and provided examples for each of them. Hopefully, this will give you a toolbox to analyze algorithms. (((Tables, Intro, Common time complexities and examples))) @@ -268,35 +261,35 @@ We went through 8 of the most common time complexities and provided examples for |Example(s) |O(1) -|<> -|<> +|<> +|<> |O(log n) -|<> -|<> +|<> +|<> |O(n) -|<> -|<> +|<> +|<> |O(n log n) -|<> -|<> +|<> +|<> |O(n^2^) -|<> -|<> +|<> +|<> |O(n^3^) -|<> -|<> +|<> +|<> |O(2^n^) -|<> -|<> +|<> +|<> |O(n!) -|<> -|<> +|<> +|<> |=== // end::table[] diff --git a/book/content/part04/bubble-sort.asc b/book/chapters/bubble-sort.adoc similarity index 85% rename from book/content/part04/bubble-sort.asc rename to book/chapters/bubble-sort.adoc index f49ddac3..007dda7a 100644 --- a/book/content/part04/bubble-sort.asc +++ b/book/chapters/bubble-sort.adoc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -==== Bubble Sort += Bubble Sort (((Bubble Sort))) (((Sorting, Bubble Sort))) (((Sinking Sort))) @@ -15,7 +15,7 @@ However, if the array is entirely out of order, it will require _O(n^2^)_ to sor (((Quadratic))) (((Runtime, Quadratic))) -===== Bubble Sort Implementation +== Bubble Sort Implementation .Bubble Sort implementation in JavaScript [source, javascript] @@ -66,15 +66,15 @@ console.log(b); //️↪️ 1 Without the destructuring assignment, swapping two values requires a temporary variable. **** -Bubble sort has a <> running time, as you might infer from the nested for-loop. +Bubble sort has a <> running time, as you might infer from the nested for-loop. -===== Bubble Sort Properties +== Bubble Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes, _O(n)_ when already sorted -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ indexterm:[Runtime, Quadratic] diff --git a/book/chapters/cheatsheet.adoc b/book/chapters/cheatsheet.adoc new file mode 100644 index 00000000..06308b35 --- /dev/null +++ b/book/chapters/cheatsheet.adoc @@ -0,0 +1,38 @@ +[appendix] += Time Complexity Cheatsheet + +This section summerize what we are going to cover in the rest of this book. + +== Runtimes + +include::big-o-examples.adoc[tag=table] + +include::algorithms-analysis.adoc[tag=table] + +== Linear Data Structures + +include::linear-data-structures-outro.adoc[tag=table] + +== Trees and Maps Data Structures + +This section covers Binary Search Tree (BST) time complexity (Big O). + +include::part3.adoc[tag=table] + +include::graph.adoc[tag=table] + +== Sorting Algorithms + +include::sorting-summary.adoc[tag=table] + +// https://algs4.cs.princeton.edu/cheatsheet/ +// http://bigocheatsheet.com/ + +// https://en.wikipedia.org/wiki/Timsort (Tim Peters) +// https://bugs.python.org/file4451/timsort.txt +// https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m + +// https://en.wikipedia.org/wiki/Sorting_algorithm +// http://sorting.at/ +// https://www.toptal.com/developers/sorting-algorithms +// https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/content/colophon.asc b/book/chapters/colophon.adoc similarity index 87% rename from book/content/colophon.asc rename to book/chapters/colophon.adoc index c6860171..5be4908a 100644 --- a/book/content/colophon.asc +++ b/book/chapters/colophon.adoc @@ -1,5 +1,5 @@ [colophon#colophon%nonfacing] -== Data Structures & Algorithms in JavaScript += {doctitle} Copyright © {docyear} Adrian Mejia @@ -11,5 +11,4 @@ No part of this publication may be produced, store in a retrieval system, or tra While every precaution has been taking in the preparation of this book, the publisher and author assume no responsibility for errors or omissions, or damages resulting from the use of the information contained herein. -// {revremark}, {revdate}. -Version {revnumber}, {revdate}. +{revremark}, {revdate}. diff --git a/book/chapters/dedication.adoc b/book/chapters/dedication.adoc new file mode 100644 index 00000000..e9c9590b --- /dev/null +++ b/book/chapters/dedication.adoc @@ -0,0 +1,5 @@ +[dedication] += Dedication + +To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail. + diff --git a/book/content/part04/divide-and-conquer.asc b/book/chapters/divide-and-conquer-fibonacci.adoc similarity index 61% rename from book/content/part04/divide-and-conquer.asc rename to book/chapters/divide-and-conquer-fibonacci.adoc index be80b106..07d99a3a 100644 --- a/book/content/part04/divide-and-conquer.asc +++ b/book/chapters/divide-and-conquer-fibonacci.adoc @@ -1,31 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -=== Divide and Conquer - -(((Divide and Conquer))) -(((Algorithmic Techniques, Divide and Conquer))) -Divide and conquer is a strategy for solving algorithmic problems. -It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. - -We have already implemented some algorithms using the divide and conquer technique. - -.Examples of divide and conquer algorithms: -- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. -- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. -- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. -- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. - -.In general, the divide and conquer algorithms have the following pattern: -1. *Divide* data into subproblems. -2. *Conquer* each subproblem. -3. *Combine* results. - -As you might know, there are multiple ways to solve a problem. Let's solve the Fibonacci numbers using a divide and conquer algorithm. Later we are going to provide a more performant solution using dynamic programming. - -==== Recursive Fibonacci Numbers += Recursive Fibonacci Numbers (((Fibonacci))) To illustrate how we can solve a problem using divide and conquer, let's write a program to find the n-th Fibonacci number. @@ -54,7 +32,7 @@ The implementation above does the job, but what's the runtime? For that, let's take a look at the job performed calculating the `fib(5)` number. Since `fib(5) = fib(4) + fib(3)`, we need to find the answer for `fib(4)` and `fib(3)`. We do that recursively until we reach the base cases of `fib(1)` and `fib(0)`. If we represent the calls in a tree, we would have the following: // http://bit.ly/2UmwzZV -[graphviz, recursive-fibonacci-call-tree, png] +[graphviz, Recursive Fibonacci call tree, png] .... graph G { "fib(5)" -- { "fib(4)", "fib(3)" } @@ -92,5 +70,3 @@ In the call tree, you can notice that every element in red and with asterisks `* Those who cannot remember the past are condemned to repeat it. For these cases when subproblems repeat themselves, we can optimize them using <>. Let's do that in the next section. - - diff --git a/book/chapters/divide-and-conquer-intro.adoc b/book/chapters/divide-and-conquer-intro.adoc new file mode 100644 index 00000000..5876599f --- /dev/null +++ b/book/chapters/divide-and-conquer-intro.adoc @@ -0,0 +1,17 @@ +(((Divide and Conquer))) +(((Algorithmic Techniques, Divide and Conquer))) +Divide and conquer is a strategy for solving algorithmic problems. +It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. + +We have already implemented some algorithms using the divide and conquer technique. + +.Examples of divide and conquer algorithms: +- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. +- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. +- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. +- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. + +.In general, the divide and conquer algorithms have the following pattern: +1. *Divide* data into subproblems. +2. *Conquer* each subproblem. +3. *Combine* results. diff --git a/book/chapters/divide-and-conquer.adoc b/book/chapters/divide-and-conquer.adoc new file mode 100644 index 00000000..b394687c --- /dev/null +++ b/book/chapters/divide-and-conquer.adoc @@ -0,0 +1,9 @@ += Divide and Conquer + +include::divide-and-conquer-intro.adoc[] + +:leveloffset: +1 + +include::divide-and-conquer-fibonacci.adoc[] + +:leveloffset: -1 diff --git a/book/chapters/dynamic-programming-fibonacci.adoc b/book/chapters/dynamic-programming-fibonacci.adoc new file mode 100644 index 00000000..86e513ec --- /dev/null +++ b/book/chapters/dynamic-programming-fibonacci.adoc @@ -0,0 +1,35 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + += Fibonacci Sequence with Dynamic Programming +(((Fibonacci))) +Let's solve the same Fibonacci problem but this time with dynamic programming. + +When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. + +.Recursive Fibonacci Implemenation using Dynamic Programming +[source, javascript] +---- +include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] +---- + +This implementation checks if we already calculated the value, if so it will save it for later use. + +[graphviz, Recursive Fibonacci call tree with dp, svg] +.... +graph G { + "fib(5)" -- { "fib(4)" } + "fib(4)" -- { "fib(3)" } + "fib(3)" -- { "fib(2)" } + "fib(2)" -- { "fib(1)", "fib(0)" } +} +.... + +This graph looks pretty linear now. It's runtime _O(n)_! +(((Linear))) +(((Runtime, Linear))) + +(((Memoization))) +TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/chapters/dynamic-programming-intro.adoc b/book/chapters/dynamic-programming-intro.adoc new file mode 100644 index 00000000..f40e9371 --- /dev/null +++ b/book/chapters/dynamic-programming-intro.adoc @@ -0,0 +1,30 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + +(((Dynamic Programming))) +(((Algorithmic Techniques, Dynamic Programming))) +Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. + +// https://twitter.com/amejiarosario/status/1103050924933726208 +// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson +// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 +// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem + +.How to explain dynamic programming to kids? 👶 +**** + +$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ + +--{sp} What's that equal to? + +--{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! + +--{sp} Add another "+1". What's the total now? + +--{sp} $$*$$*_Quickly_*$$*$$ Eleven! + +--{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." +**** + diff --git a/book/chapters/dynamic-programming-knapsack-problem.adoc b/book/chapters/dynamic-programming-knapsack-problem.adoc new file mode 100644 index 00000000..b581632f --- /dev/null +++ b/book/chapters/dynamic-programming-knapsack-problem.adoc @@ -0,0 +1,52 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + += Knapsack Problem + +The knapsack (backpack [big]#🎒#) problem is the following: + +> A thief breaks into a museum with a backpack that can carry certain weight. +What items shoud he pick to maximize his loot? + +Take a look at the following example to understand better the problem. + +.Knapsack Problem Examples +[source, javascript] +---- + +// Input: +const museumGoods = [ + { value: 1, weight: 1}, + { value: 4, weight: 3 }, + { value: 5, weight: 4 }, + { value: 7, weight: 5 }, +] + +const maxBackpackWeight = 7; + +// Solution: +const backpack = solveKnapsackProblem(museumGoods, maxBackpackWeight); + +// Output: +expect(backpack.items).to.equal([ + { value: 4, weight: 3 }, + { value: 5, weight: 4 } +]) + +expect(backpack.weight).toBeLessThanOrEqual(7); +expect(backpack.value).toBe(9); +---- + +How can we solve this problem? You cannot take them all since total weight is 13 and we only can carry 7. You should not take only one, since that would not be the maximum loot and you would + +One idea would be sort the items by weight and take the items if they do not exceed the max weight. +In that case, the result would be: + +---- + { value: 7, weight: 5 }, + { value: 1, weight: 1}, +---- + +As you can see, this solution is not optimal. The value total value is `8` and the weight just `6`. diff --git a/book/chapters/dynamic-programming.adoc b/book/chapters/dynamic-programming.adoc new file mode 100644 index 00000000..269a4178 --- /dev/null +++ b/book/chapters/dynamic-programming.adoc @@ -0,0 +1,16 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + += Dynamic Programming + +include::dynamic-programming-intro.adoc[] + +:leveloffset: +1 + +include::dynamic-programming-fibonacci.adoc[] + +// include::chapters/dynamic-programming-knapsack-problem.adoc[] + +:leveloffset: -1 diff --git a/book/chapters/epigraph.adoc b/book/chapters/epigraph.adoc new file mode 100644 index 00000000..a70dd6d3 --- /dev/null +++ b/book/chapters/epigraph.adoc @@ -0,0 +1,4 @@ +[epigraph] += Epigraph + +Thanks for reading this book. Stay effective! diff --git a/book/content/part03/graph-search.asc b/book/chapters/graph-search.adoc similarity index 65% rename from book/content/part03/graph-search.asc rename to book/chapters/graph-search.adoc index d19d5fd6..cb64a3bc 100644 --- a/book/content/part03/graph-search.asc +++ b/book/chapters/graph-search.adoc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -=== Graph Search += Graph Search Graph search allows you to visit search elements. @@ -11,38 +11,36 @@ WARNING: Graph search is very similar to <>. So, if yo There are two ways to navigate the graph, one is using Depth-First Search (DFS) and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. -image::directed-graph.png[directed graph] +[graphviz, directed graph, png] +.... +digraph G { -// [graphviz, directed graph, png] -// .... -// digraph G { + node [fillcolor="#F8E71C" style=filled shape=circle] 0; + node [fillcolor="#F5A623"] 1; + node [fillcolor="#B8E986"] 2; + node [fillcolor="#BD10E0"] 3; + node [fillcolor="#50E3C2"] 4; + node [fillcolor="#4A90E2"] 5; + // node [fillcolor="#FF5252"] 6; -// node [fillcolor="#F8E71C" style=filled shape=circle] 0; -// node [fillcolor="#F5A623"] 1; -// node [fillcolor="#B8E986"] 2; -// node [fillcolor="#BD10E0"] 3; -// node [fillcolor="#50E3C2"] 4; -// node [fillcolor="#4A90E2"] 5; -// // node [fillcolor="#FF5252"] 6; + 0 -> 5 + 0 -> 4 + 0 -> 1 + 1 -> 4 + 1 -> 3 + 2 -> 1 + 3 -> 4 + 3 -> 2 -// 0 -> 5 -// 0 -> 4 -// 0 -> 1 -// 1 -> 4 -// 1 -> 3 -// 2 -> 1 -// 3 -> 4 -// 3 -> 2 + // label="DFS" -// // label="DFS" + { rank=same; 3, 1 } + { rank=same; 0, 4 } -// { rank=same; 3, 1 } -// { rank=same; 0, 4 } +} +.... -// } -// .... - -==== Depth-First Search for Graphs +== Depth-First Search for Graphs With Depth-First Search (DFS) we go deep before going wide. @@ -54,7 +52,7 @@ So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. // TODO: add arrows to show DFS and create another one for BFS -==== Breadth-First Search for Graphs +== Breadth-First Search for Graphs With Breadth-First Search (BFS) we go wide before going deep. @@ -66,7 +64,7 @@ After all the children of node `0` are visited it continue with all the children In summary, BFS would visit the graph: `[0, 5, 1, 4, 3, 2]` -==== Depth-First Search vs. Breadth-First Search in a Graph +== Depth-First Search vs. Breadth-First Search in a Graph DFS and BFS can implementation can be almost identical; the difference is the underlying data structured. In our implementation, we have a generic `graphSearch` where we pass the first element to start the search the data structure that we can to use: @@ -76,13 +74,13 @@ DFS and BFS can implementation can be almost identical; the difference is the un include::{codedir}/data-structures/graphs/graph.js[tag=graphSearch,indent=0] ---- -Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. +Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. -TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. +TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. You might wonder what the difference between search algorithms in a tree and a graph is? Check out the next section. -==== DFS/BFS on Tree vs Graph +== DFS/BFS on Tree vs Graph The difference between searching a tree and a graph is that the tree always has a starting point (root node). However, in a graph, you can start searching anywhere. There's no root. diff --git a/book/content/part03/graph.asc b/book/chapters/graph.adoc similarity index 91% rename from book/content/part03/graph.asc rename to book/chapters/graph.adoc index 35d15b40..a4ee9352 100644 --- a/book/content/part03/graph.asc +++ b/book/chapters/graph.adoc @@ -1,10 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[graph]] -=== Graph += Graph (((Graph))) (((Data Structures, Non-Linear, Graph))) Graphs are one of my favorite data structures. @@ -27,32 +26,32 @@ The only difference is that it uses an *array* of adjacent nodes instead of just Other difference between a linked list and graph is that a linked list always has a root node (or first element), while the graph doesn’t. You can start traversing a graph from anywhere. Let’s examine these graph properties! -==== Graph Properties +== Graph Properties The connection between two nodes is called *edge*. Also, nodes might be called *vertex*. .Graph is composed of vertices/nodes and edges -image::image42.png[image,width=305,height=233] +image:image42.png[image,width=305,height=233] -===== Directed Graph vs Undirected +=== Directed Graph vs Undirected A graph can be either *directed* or *undirected*. .Graph: directed vs undirected -image::image43.jpg[image,width=469,height=192] +image:image43.jpg[image,width=469,height=192] An *undirected graph* has edges that are *two-way street*. E.g., On the undirected example, you can traverse from the green node to the orange and vice versa. A *directed graph (digraph)* has edges that are *one-way street*. E.g., On the directed example, you can only go from green node to orange and not the other way around. When one node has an edge to itself is called a *self-loop*. -===== Graph Cycles +=== Graph Cycles A graph can have *cycles* or not. .Cyclic vs Acyclic Graphs. -image::image44.jpg[image,width=444,height=194] +image:image44.jpg[image,width=444,height=194] (((Cyclic Graph))) A *cyclic graph* is the one that you can pass through a node more than once. @@ -65,10 +64,10 @@ An acyclic graph is the one that you can’t pass through a node more than once. (((DAG))) The *Directed Acyclic Graph (DAG)* is unique. It has many applications like scheduling tasks, spreadsheets change propagation, and so forth. DAG is also called *Tree* data structure only when each node has only *one parent*. -===== Connected vs Disconnected vs Complete Graphs +=== Connected vs Disconnected vs Complete Graphs .Different kinds of graphs: disconnected, connected, and complete. -image::image45.png[image,width=1528,height=300] +image:image45.png[image,width=1528,height=300] A *disconnected graph* is one that has one or more subgraph. In other words, a graph is *disconnected* if two nodes don’t have a path between them. @@ -76,16 +75,16 @@ A *connected graph* is the opposite to disconnected, there’s a path between ev A *complete graph* is where every node is adjacent to all the other nodes in the graph. E.g., If there are seven nodes, every node has six edges. -===== Weighted Graphs +=== Weighted Graphs (((Weighted Graphs))) Weighted graphs have labels in the edges (a.k.a *weight* or *cost*). The link weight can represent many things like distance, travel time, or anything else. .Weighted Graph representing USA airports distance in miles. -image::image46.png[image,width=528,height=337] +image:image46.png[image,width=528,height=337] For instance, a weighted graph can have a distance between nodes. So, algorithms can use the weight and optimize the path between them. -==== Exciting Graph applications in real-world +== Exciting Graph applications in real-world Now that we know what graphs are and some of their properties. Let’s discuss some real-life usages of graphs. @@ -108,19 +107,19 @@ Graphs become a metaphor where nodes and edges model something from our physical There are endless applications for graphs in electronics, social networks, recommendation systems and many more. That’s cool and all, but how do we represent graphs in code? Let’s see that in the next section. -==== Representing Graphs +== Representing Graphs There are two main ways to graphs one is: * Adjacency Matrix * Adjacency List -===== Adjacency Matrix +=== Adjacency Matrix (((Adjacency Matrix))) Representing graphs as adjacency matrix is done using a two-dimensional array. For instance, let’s say we have the following graph: .Graph and its adjacency matrix. -image::image47.png[image,width=438,height=253] +image:image47.png[image,width=438,height=253] The number of vertices |V| define the size of the matrix. In the example, we have five vertices, so we have a 5x5 matrix. @@ -162,16 +161,16 @@ TIP: When the graph has few connections compared to the number of nodes we say t The space complexity of the adjacency matrix is *O(|V|^2^)*, where |V| is the number of vertices/nodes. -===== Adjacency List +=== Adjacency List (((Adjacency List))) Another way to represent a graph is by using an adjacency list. This time instead of using an array (matrix) we use a list. .Graph represented as an Adjacency List. -image::image48.png[image,width=528,height=237] +image:image48.png[image,width=528,height=237] If we want to add a new node to the list, we can do it by adding one element to the end of the array of nodes *O(1)*. In the next section, we are going to explore the running times of all operations in an adjacency list. -==== Implementing a Graph data structure +== Implementing a Graph data structure Since adjacency lists are more efficient (than adjacency matrix), we are going to use to implement a graph data structure. @@ -185,7 +184,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=constructor] Notice that the constructor takes a parameter. The `edgeDirection` allow us to use one class for both undirected and directed graphs. -==== Adding a vertex +== Adding a vertex For adding a vertex, we first need to check if the node already exists. If so, we return the node. @@ -200,7 +199,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=addVertex, indent=0] If the node doesn't exist, then we create the new node and add it to a `HashMap`. -TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. +TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. The `key` is the node's value, while the `value` is the newly created node. @@ -213,7 +212,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=constructor, indent=0] ---- -==== Deleting a vertex +== Deleting a vertex .Graphs's `removeVertex` method [source, javascript] @@ -236,7 +235,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] All adjacencies are stored as a HashSet to provide constant time deletion. -==== Adding an edge +== Adding an edge An edge is a connection between two nodes (vertices). If the graph is undirected means that every link is a two-way street. When we create the edge from node 1 to node 2, we also need to establish a connection between node 2 and 1 for undirected graphs. @@ -259,7 +258,7 @@ We can add adjacencies using the `addAdjacent` method from the Node class. include::{codedir}/data-structures/graphs/node.js[tag=addAdjacent, indent=0] ---- -==== Querying Adjacency +== Querying Adjacency .Graphs's `areAdjacents` method [source, javascript] @@ -274,7 +273,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=isAdjacent, indent=0] ---- -==== Deleting an edge +== Deleting an edge .Graphs's `removeEdge` method [source, javascript] @@ -288,7 +287,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=removeEdge, indent=0] include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] ---- <<< -==== Graph Complexity +== Graph Complexity (((Tables, Non-Linear DS, Graph adjacency matrix/list complexities))) // tag::table[] diff --git a/book/chapters/greedy-algorithms-intro.adoc b/book/chapters/greedy-algorithms-intro.adoc new file mode 100644 index 00000000..f97bb42a --- /dev/null +++ b/book/chapters/greedy-algorithms-intro.adoc @@ -0,0 +1,50 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + +(((Greedy Algorithms))) +(((Algorithmic Techniques, Greedy Algorithms))) +Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. +They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. + +An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. + +[graphviz, Find the largest sum, svg] +.... +graph G { + 5 -- 3 [color="#B8E986", penwidth=2] + 5 -- 7 [color="#FF5252", penwidth=2] + 3 -- 87 [color="#B8E986", penwidth=2] + 3 -- 1 + 7 -- 2 + 7 -- 4 [color="#FF5252", penwidth=2] + + label="Optimal vs. Greedy path" +} +.... + +Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. + +Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. + +[TIP] +==== +Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. +This algorithm only gives one shot at finding the solution and never goes back to consider other options. +==== + +Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. + +.Some examples of greedy algorithms that works well: +- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. +- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. +indexterm:[Merge Sort] + + +.In general, we can follow these steps to design Greedy Algorithms: +1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). +2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. +3. Reduce the processed input and repeat step #1 and #2 until all data is gone. +4. Return solution. +5. Check correctness with different examples and edge cases. diff --git a/book/chapters/greedy-algorithms-knapsack-problem.adoc b/book/chapters/greedy-algorithms-knapsack-problem.adoc new file mode 100644 index 00000000..7993b180 --- /dev/null +++ b/book/chapters/greedy-algorithms-knapsack-problem.adoc @@ -0,0 +1,57 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + += Fractional Knapsack Problem + +We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: + +> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? + +Let's say we have the following items available. + +.Knpasack Input +[source, javascript] +---- +const items = [ + { value: 1, weight: 1}, + { value: 4, weight: 3 }, + { value: 5, weight: 4 }, + { value: 7, weight: 5 }, +]; + +const maxWeight = 7; +---- + +So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. + +How would you solve this problem? + +First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: + +- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. + +- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# + +- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# + +.Items value/weight ratio +---- + { value: 1, weight: 1 }, // 1/1 = 1 + { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ + { value: 5, weight: 4 }, // 5/4 = 1.25 + { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ +---- + +Let's implement this algorithm! + +.Factional Knapsack Problem Implementation +[source, javascript] +---- +include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] +---- + +What's the runtime of this algorithm? + +We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/chapters/greedy-algorithms.adoc b/book/chapters/greedy-algorithms.adoc new file mode 100644 index 00000000..43685ec7 --- /dev/null +++ b/book/chapters/greedy-algorithms.adoc @@ -0,0 +1,9 @@ += Greedy Algorithms + +include::greedy-algorithms-intro.adoc[] + +:leveloffset: +1 + +include::greedy-algorithms-knapsack-problem.adoc[] + +:leveloffset: -1 diff --git a/book/chapters/heap-sort.adoc b/book/chapters/heap-sort.adoc new file mode 100644 index 00000000..421cab79 --- /dev/null +++ b/book/chapters/heap-sort.adoc @@ -0,0 +1,7 @@ += Heap Sort + +Voluptate consequat magna laborum consectetur fugiat deserunt. Id sit est ullamco magna sint laborum proident. Exercitation cupidatat exercitation excepteur ex pariatur qui qui sint amet consectetur laborum ex mollit dolore. + +Et do sunt do labore culpa est eu ut fugiat eiusmod ea excepteur. Irure commodo adipisicing in aute aliquip laborum laboris reprehenderit incididunt in sunt. Cupidatat veniam est culpa ex eu aute voluptate tempor aliqua ullamco sunt et consectetur. Eu laboris mollit culpa consequat. Sunt mollit quis dolor nostrud. In duis mollit do adipisicing veniam do deserunt exercitation Lorem deserunt aliquip. Ea esse reprehenderit incididunt eu deserunt sit nulla sint non eiusmod nisi eu et irure. + +Ad commodo anim nulla occaecat non. Aute fugiat laborum ut mollit exercitation aute proident reprehenderit culpa consectetur. Cillum officia laborum proident labore sunt est eiusmod proident. Lorem nostrud ea qui tempor culpa ullamco ipsum. Dolore nulla minim qui incididunt qui sint consectetur quis tempor esse minim. Do id consequat commodo sit officia aliqua officia reprehenderit eiusmod elit do amet. diff --git a/book/chapters/heap.adoc b/book/chapters/heap.adoc new file mode 100644 index 00000000..104af153 --- /dev/null +++ b/book/chapters/heap.adoc @@ -0,0 +1,3 @@ += Heap + +Sit nostrud Lorem nulla ipsum occaecat enim eiusmod adipisicing velit et cupidatat laboris incididunt. Sunt ex eiusmod amet nulla quis. Officia elit non sunt esse sint. Non enim do laborum adipisicing officia et aliquip cillum ut nisi ipsum. Minim duis minim velit amet laborum aliquip pariatur irure deserunt ex. diff --git a/book/chapters/index.adoc b/book/chapters/index.adoc new file mode 100644 index 00000000..85e81b85 --- /dev/null +++ b/book/chapters/index.adoc @@ -0,0 +1,2 @@ +[index] += Index diff --git a/book/chapters/insertion-selection-bubble-sort.adoc b/book/chapters/insertion-selection-bubble-sort.adoc new file mode 100644 index 00000000..4b0ea8e2 --- /dev/null +++ b/book/chapters/insertion-selection-bubble-sort.adoc @@ -0,0 +1,3 @@ += Insertion vs Selection vs Bubble Sort + +All these three algorithms diff --git a/book/content/part04/insertion-sort.asc b/book/chapters/insertion-sort.adoc similarity index 81% rename from book/content/part04/insertion-sort.asc rename to book/chapters/insertion-sort.adoc index c8bc818d..c44c4c5e 100644 --- a/book/content/part04/insertion-sort.asc +++ b/book/chapters/insertion-sort.adoc @@ -1,10 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[insertion-sort]] -==== Insertion Sort += Insertion Sort (((Sorting, Insertion Sort))) (((Insertion Sort))) @@ -12,7 +11,7 @@ Insertion sort is a simple sorting algorithm. It is one of the most natural ways // Good illustration on of sorting a deck of cards: https://www.khanacademy.org/computing/computer-science/algorithms/insertion-sort/a/insertion-sort -===== Insertion Sort Implementation +== Insertion Sort Implementation Insertion sort does the following: It starts from the 2nd element, and it tries to find anything to the left that could be bigger than the current item. It will swap all the elements with higher value @@ -29,14 +28,14 @@ include::{codedir}/algorithms/sorting/insertion-sort.js[tag=sort, indent=0] <4> We check every element on the left side and swap any of them that are out of order -===== Insertion Sort Properties +== Insertion Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ (((Quadratic))) (((Runtime, Quadratic))) diff --git a/book/part02-linear-data-structures.asc b/book/chapters/linear-data-structures-intro.adoc similarity index 59% rename from book/part02-linear-data-structures.asc rename to book/chapters/linear-data-structures-intro.adoc index ad0db79e..a9b5d3b3 100644 --- a/book/part02-linear-data-structures.asc +++ b/book/chapters/linear-data-structures-intro.adoc @@ -1,17 +1,16 @@ -[[part02-linear-data-structures]] -== Linear Data Structures - +[partintro] +-- Data Structures comes in many flavors. There’s no one to rule them all. You have to know the tradeoffs so you can choose the right one for the job. Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you how when to use over the other or even tweak them to create a new one. We are going to explore the most common data structures time and space complexity. .In this part we are going to learn about the following linear data structures: -- <> -- <> -- <> -- <> +- <> +- <> +- <> +- <> -Later, in the next part, we are going to explore non-linear data structures like <> and <>. +Later, in the next part, we are going to explore non-linear data structures like <> and <>. ifdef::backend-html5[] If you want to have a general overview of each one, take a look at the following interactive diagram: @@ -22,18 +21,4 @@ If you want to have a general overview of each one, take a look at the following +++ endif::[] -include::content/part02/array.asc[] - -<<< -include::content/part02/linked-list.asc[] - -<<< -include::content/part02/stack.asc[] - -<<< -include::content/part02/queue.asc[] - -<<< -include::content/part02/array-vs-list-vs-queue-vs-stack.asc[] - - +-- diff --git a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc b/book/chapters/linear-data-structures-outro.adoc similarity index 57% rename from book/content/part02/array-vs-list-vs-queue-vs-stack.asc rename to book/chapters/linear-data-structures-outro.adoc index 127ce33b..dc0a0696 100644 --- a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc +++ b/book/chapters/linear-data-structures-outro.adoc @@ -1,9 +1,4 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -=== Array vs. Linked List & Queue vs. Stack += Array vs. Linked List & Queue vs. Stack In this part of the book, we explored the most used linear data structures such as Arrays, Linked Lists, Stacks and Queues. We implemented them and discussed the runtime of their operations. @@ -18,24 +13,23 @@ In this part of the book, we explored the most used linear data structures such .Use a Queue when: * You need to access your data in a first-come, first served basis (FIFO). -* You need to implement a <> +* You need to implement a <> .Use a Stack when: * You need to access your data as last-in, first-out (LIFO). -* You need to implement a <> +* You need to implement a <> (((Tables, Linear DS, Array/Lists/Stack/Queue complexities))) -[[linear-data-structures-table]] // tag::table[] .Time/Space Complexity of Linear Data Structures (Array, LinkedList, Stack & Queues) |=== .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) -| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) +| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) | Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) |=== // end::table[] diff --git a/book/content/part02/linked-list.asc b/book/chapters/linked-list.adoc similarity index 89% rename from book/content/part02/linked-list.asc rename to book/chapters/linked-list.adoc index f253ac34..50f103cf 100644 --- a/book/content/part02/linked-list.asc +++ b/book/chapters/linked-list.adoc @@ -1,10 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[linked-list]] -=== Linked List += Linked List (((Linked List))) (((List))) (((Data Structures, Linear, Linked List))) @@ -15,23 +14,22 @@ A list (or Linked List) is a linear data structure where each node is "linked" t - Doubly: every node has a reference to the next and previous object - Circular: the last element points to the first one. -[[singly-linked-list]] -==== Singly Linked List + +== Singly Linked List Each element or node is *connected* to the next one by a reference. When a node only has one connection it's called *singly linked list*: .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. -image::image19.png[image,width=498,height=97] +image:image19.png[image,width=498,height=97] Usually, a Linked List is referenced by the first element in called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. -[[doubly-linked-list]] -==== Doubly Linked List +== Doubly Linked List When each node has a connection to the `next` item and also the `previous` one, then we have a *doubly linked list*. .Doubly Linked List: each node has a reference to the next and previous element. -image::image20.png[image,width=528,height=74] +image:image20.png[image,width=528,height=74] With a doubly list you can not only move forward but also backward. If you keep the reference to the last element (`cat`) you can step back and reach the middle part. @@ -45,7 +43,7 @@ If we implement the code for the `Node` elements, it would be something like thi include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ---- -==== Linked List vs. Array +== Linked List vs. Array Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t always an array more efficient with _O(1)_ access time? It depends. @@ -55,7 +53,7 @@ Another difference is that adding/deleting at the beginning on an array takes O( A drawback of a linked list is that if you want to insert/delete an element at the end of the list, you would have to navigate the whole collection to find the last one O(n). However, this can be solved by keeping track of the last element in the list. We are going to implement that! -==== Implementing a Linked List +== Implementing a Linked List We are going to implement a doubly linked list. First, let's start with the constructor. @@ -72,7 +70,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. -==== Searching by value +== Searching by value Finding an element by value there’s no other way than iterating through the whole list. @@ -99,7 +97,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent= We are going to use this `find` method again to implement searching by index. -==== Searching by index +== Searching by index Searching by index is very similar, we iterate through the list until we find the element that matches the position. @@ -111,21 +109,22 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. -==== Insertion +== Insertion Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. -[[linked-list-inserting-beginning]] -===== Inserting elements at the beginning of the list +=== Inserting elements at the beginning of the list We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. .Insert at the beginning by linking the new node with the current first node. -image::image23.png[image,width=498,height=217] +image:image23.png[image,width=498,height=217] To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: +[#linked-list-inserting-beginning] + .Add item to the beginning of a Linked List [source, javascript] ---- @@ -135,12 +134,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addFirst, ind As you can see, we create a new node and make it the first one. -===== Inserting element at the end of the list +=== Inserting element at the end of the list Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list -image::image24.png[image,width=498,height=208] +image:image24.png[image,width=498,height=208] .Linked List's add to the end of the list implementation [source, javascript] @@ -151,7 +150,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, inde If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. -===== Inserting element at the middle of the list +=== Inserting element at the middle of the list For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. @@ -171,7 +170,7 @@ art <-> dog <-> cat We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. -image::image25.png[image,width=528,height=358] +image:image25.png[image,width=528,height=358] Take a look into the implementation of https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js#L83[LinkedList.add]: @@ -190,16 +189,16 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, in Take notice that we reused, `addFirst` and `addLast` methods. For all the other cases the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting on the middle takes *O(n)* because we have to iterate through the list using the `get` method. -==== Deletion +== Deletion Deleting is an interesting one. We don’t delete an element; we remove all references to that node. Let’s go case by case to explore what happens. -===== Deleting element from the head +=== Deleting element from the head Deleting the first element (or head) is a matter of removing all references to it. .Deleting an element from the head of the list -image::image26.png[image,width=528,height=74] +image:image26.png[image,width=528,height=74] For instance, to remove the head (“art”) node, we change the variable `first` to point to the second node “dog”. We also remove the variable `previous` from the "dog" node, so it doesn't point to the “art” node. The garbage collector will get rid of the “art” node when it seems nothing is using it anymore. @@ -211,12 +210,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeFirst, As you can see, when we want to remove the first node we make the 2nd element the first one. -===== Deleting element from the tail +=== Deleting element from the tail Removing the last element from the list would require to iterate from the head until we find the last one, that’s O(n). But, If we have a reference to the last element, which we do, We can do it in _O(1)_ instead! .Removing last element from the list using the last reference. -image::image27.png[image,width=528,height=221] +image:image27.png[image,width=528,height=221] For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat” then is out of the list and eventually is deleted from memory by the garbage collector. @@ -230,12 +229,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. -===== Deleting element from the middle +=== Deleting element from the middle To remove a node from the middle, we make the surrounding nodes to bypass the one we want to delete. .Remove the middle node -image::image28.png[image,width=528,height=259] +image:image28.png[image,width=528,height=259] In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art” totally bypassing “dog”. @@ -250,7 +249,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeByPosit Notice that we are using the `get` method to get the node at the current position. That method loops through the list until it found the node at the specified location. This iteration has a runtime of _O(n)_. -==== Linked List Complexity vs. Array Complexity +== Linked List Complexity vs. Array Complexity So far, we have seen two liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) @@ -279,9 +278,9 @@ Use arrays when: Use a doubly linked list when: -* You want to access elements in a *sequential* manner only like <> or <>. +* You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). * You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. diff --git a/book/content/part03/map.asc b/book/chapters/map-hashmap-vs-treemap.adoc similarity index 55% rename from book/content/part03/map.asc rename to book/chapters/map-hashmap-vs-treemap.adoc index d03dae4f..732d81e1 100644 --- a/book/content/part03/map.asc +++ b/book/chapters/map-hashmap-vs-treemap.adoc @@ -1,39 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[map]] -=== Map -(((Map))) -(((Data Structures, Non-Linear, Map))) -A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. - -IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. - -Many languages have maps already built-in. JavaScript/Node has `Map`: - -.JavaScript Built-in Map Usage -[source, javascript] ----- -include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] ----- - -In short, you set `key`/`value` pair and then you can get the `value` using the `key`. - -The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: - -* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. -* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. - -<<< -include::hashmap.asc[] - -<<< -include::treemap.asc[] - -<<< -==== HashMap vs TreeMap += HashMap vs TreeMap .A map can be implemented using hash functions or binary search tree: - *HashMap*: it’s a map implementation using an *array* and *hash function*. The job of the hash function is to convert the key into an index that contains the matching data. Optimized HashMap can have an average runtime of *O(1)*. @@ -42,12 +12,12 @@ include::treemap.asc[] .When to use a TreeMap vs. HashMap? * `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. -* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. +* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average.  * `HashMap`’s keys are in insertion order (or random depending in the implementation). `TreeMap`’s keys are always sorted. * `TreeMap` offers some statistical data for free such as: get minimum, get maximum, median, find ranges of keys. `HashMap` doesn’t. * `TreeMap` has a guarantee always an *O(log n)*, while `HashMap`s has an amortized time of *O(1)* but in the rare case of a rehash, it would take an *O(n)*. -===== TreeMap Time complexity vs HashMap +== TreeMap Time complexity vs HashMap As we discussed so far, there is a trade-off between the implementations. (((Tables, Non-Linear DS, HashMap/TreeMap complexities))) diff --git a/book/content/part03/hashmap.asc b/book/chapters/map-hashmap.adoc similarity index 95% rename from book/content/part03/hashmap.asc rename to book/chapters/map-hashmap.adoc index 2a00067f..9f4ceabb 100644 --- a/book/content/part03/hashmap.asc +++ b/book/chapters/map-hashmap.adoc @@ -1,10 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[hashmap]] -==== HashMap += HashMap (((HashMap))) (((HashTable))) (((Data Structures, Non-Linear, HashMap))) @@ -24,7 +23,7 @@ How are the keys mapped to their values? Using a hash function. Here’s an illustration: .Internal HashMap representation -image::image41.png[image,width=528,height=299] +image:image41.png[image,width=528,height=299] .This is the main idea: @@ -37,7 +36,7 @@ In a HashMap, a *collision* is when different keys lead to the same index. They Having a big bucket size can avoid a collision but also can waste too much memory. We are going to build an _optimized_ HashMap that re-sizes itself when it is getting full. This auto-resizing avoids collisions and don't need to allocate too much memory upfront. Let’s start with the *hash function*. -===== Designing an optimized hash function +== Designing an optimized hash function To minimize collisions, we need to create an excellent hash function. @@ -53,7 +52,7 @@ It’s no practical and memory-wise wasteful to have a perfect hash function, so Before doing a great hash function, let's see what a lousy hash function looks like. 😉 -====== Analysing collisions on bad hash code functions +=== Analysing collisions on bad hash code functions The goal of a hash code function is to convert any value given into a positive integer — a common way to accomplish with summing each string’s Unicode value. @@ -153,7 +152,7 @@ Now it’s more evenly distributed!! [big]#😎👍# Let’s design a better HashMap with what we learned. -====== Implementing an optimized hash function +=== Implementing an optimized hash function We are going to use a battle-tested non-cryptographic hash function called FNV Hash. @@ -190,7 +189,7 @@ FVN-1a hash function is a good trade-off between speed and collision prevention. Now that we have a proper hash function. Let’s move on with the rest of the HashMap implementation. -===== Implementing a HashMap in JavaScript +== Implementing a HashMap in JavaScript Let’s start by creating a class and its constructor to initialize the hash map. We are going to have an array called `buckets` to hold all the data. @@ -210,7 +209,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getLoadFactor, Notice that we are also keeping track of collisions (for benchmarking purposes) and a load factor. *The load factor* measures how full the hash map is. We don’t want to be fuller than 75%. If the HashMap is getting too full, then we are going to fix it doing a *rehash* (more on that later). -====== Inserting elements in a HashMap +=== Inserting elements in a HashMap To insert values into a HashMap, we first convert the *key* into an *array index* using the hash and compression function. Each bucket of the array will have an object with the shape of `{key, value}`. @@ -229,7 +228,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=set, indent=0] Notice, that we are using a function called `getEntry` to check if the key already exists. It gets the index of the bucket corresponding to the key and then checks if the entry with the given key exists. We are going to implement this function in a bit. -====== Getting values out of a HashMap +=== Getting values out of a HashMap For getting values out of the Map, we do something similar to inserting. We convert the key into an `index` using the hash function, then we that `index` we look for the value in the bucket. @@ -240,7 +239,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getEntry, inde ---- <1> Convert key to an array index. <2> If the bucket is empty create a new linked list -<3> Use Linked list's <> method to find value on the bucket. +<3> Use Linked list's <> method to find value on the bucket. <4> Return `bucket` and `entry` if found. With the help of the `getEntry` method, we can do the `HashMap.get` and `HashMap.has` methods: @@ -261,7 +260,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=has, indent=0] For `HashMap.has` we only care if the value exists or not, while that for `HashMap.get` we want to return the value or `undefined` if it doesn’t exist. -====== Deleting from a HashMap +=== Deleting from a HashMap Removing items from a HashMap is not too different from what we did before. @@ -275,7 +274,7 @@ If the bucket doesn’t exist or is empty, we don't have to do anything else. If https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L218[`LinkedList.remove` ] method. -===== Rehashing a HashMap +== Rehashing a HashMap Rehashing is a technique to minimize collisions when a hash map is getting full. It doubles the size of the map and recomputes all the hash codes and insert data in the new buckets. @@ -290,7 +289,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=rehash, indent In the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/maps/hash-maps/primes.js#L33[prime.js] file you can find the implementation for finding the next prime. Also, you can see the full HashMap implementation on this file: https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/maps/hash-maps/hash-map.js#L1[hashmap.js] -===== HashMap time complexity +== HashMap time complexity Hash Map it’s very optimal for searching values by key in constant time *O(1)*. However, searching by value is not any better than an array since we have to visit every value *O(n)*. (((Tables, Non-Linear DS, HashMap complexities))) diff --git a/book/chapters/map-intro.adoc b/book/chapters/map-intro.adoc new file mode 100644 index 00000000..9bbd3849 --- /dev/null +++ b/book/chapters/map-intro.adoc @@ -0,0 +1,26 @@ +ifndef::imagesdir[] +:imagesdir: ../images +:codedir: ../../src +endif::[] + += Map +(((Map))) +(((Data Structures, Non-Linear, Map))) +A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. + +IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. + +Many languages have maps already built-in. JavaScript/Node has `Map`: + +.JavaScript Built-in Map Usage +[source, javascript] +---- +include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] +---- + +In short, you set `key`/`value` pair and then you can get the `value` using the `key`. + +The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: + +* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. +* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. diff --git a/book/content/part03/treemap.asc b/book/chapters/map-treemap.adoc similarity index 94% rename from book/content/part03/treemap.asc rename to book/chapters/map-treemap.adoc index 61e91436..d862689f 100644 --- a/book/content/part03/treemap.asc +++ b/book/chapters/map-treemap.adoc @@ -1,10 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[treemap]] -==== TreeMap += TreeMap (((TreeMap))) (((Data Structures, Non-Linear, TreeMap))) A TreeMap is a Map implementation using Binary Search Trees. @@ -36,7 +35,7 @@ class TreeMap { } ---- -===== Inserting values into a TreeMap +== Inserting values into a TreeMap For inserting a value on a TreeMap, we first need to inialize the tree: @@ -58,7 +57,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=set, indent=0] Adding values is very easy (once we have the underlying tree implementation). -===== Getting values out of a TreeMap +== Getting values out of a TreeMap When We search by key in a tree map, it takes *O(log n)*. This is the implementation: @@ -82,7 +81,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=iterators, ind Generators are useful for producing values that can you can iterate in a `for...of` loop. Generators use the `function*` syntax which expects to have a `yield` with a value. **** -===== Deleting values from a TreeMap +== Deleting values from a TreeMap Removing elements from TreeMap is simple. diff --git a/book/chapters/map.adoc b/book/chapters/map.adoc new file mode 100644 index 00000000..63307e68 --- /dev/null +++ b/book/chapters/map.adoc @@ -0,0 +1,18 @@ +<<< +include::map-intro.adoc[] + +:leveloffset: +1 + +// (g) +<<< +include::map-hashmap.adoc[] + +// (g) +<<< +include::map-treemap.adoc[] + +// (g) +<<< +include::map-hashmap-vs-treemap.adoc[] + +:leveloffset: -1 diff --git a/book/content/part04/merge-sort.asc b/book/chapters/merge-sort.adoc similarity index 82% rename from book/content/part04/merge-sort.asc rename to book/chapters/merge-sort.adoc index 65e90f0d..91cb45b0 100644 --- a/book/content/part04/merge-sort.asc +++ b/book/chapters/merge-sort.adoc @@ -1,22 +1,19 @@ ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src +:imagesdir: ../images +:codedir: ../../src endif::[] -[[merge-sort]] -==== Merge Sort - += Merge Sort (((Sorting, Merge Sort))) (((Merge Sort))) - Merge Sort is an efficient sorting algorithm that uses <> paradigm to accomplish its task faster. However, It uses auxiliary memory in the process of sorting. indexterm:[Divide and Conquer] Merge sort algorithm splits the array into halves until 2 or fewer elements are left. It sorts these two elements and then merges back all halves until the whole collection is sorted. -image::image11.png[Mergesort visualization,width=500,height=600] +image:image11.png[Mergesort visualization,width=500,height=600] -===== Merge Sort Implementation +== Merge Sort Implementation .Merge Sort implementation in JavaScript (mergeSort) [source, javascript] @@ -47,17 +44,17 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge, indent=0] <2> If `array1` current element (`i1`) has the lowest value, we insert it into the `mergedArray` if not we then insert `array2` element. <3> `mergedArray` is `array1` and `array2` combined in ascending order (sorted). -Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. +Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. -===== Merge Sort Properties +== Merge Sort Properties - <>: [big]#✅# Yes - <>: [big]#️❌# No, it requires auxiliary memory O(n). - <>: [big]#️❌# No, new elements will require to sort the whole array. - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - Recursive: Yes -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory +- Time Complexity: [big]#✅# <> _O(n log n)_ +- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory (((Linearithmic))) (((Runtime, Linearithmic))) diff --git a/book/chapters/non-linear-data-structures-intro.adoc b/book/chapters/non-linear-data-structures-intro.adoc new file mode 100644 index 00000000..0a1455e1 --- /dev/null +++ b/book/chapters/non-linear-data-structures-intro.adoc @@ -0,0 +1,12 @@ +[partintro] +-- +Non-Linear data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. + +.In this chapter we are going to learn: +- Exciting <> data structure applications +- Searching efficiently with a <> data structures. +- One of the most versatile data structure of all <>. +- Keeping dups out with a <>. + +By the end of this section, you will know the data structures trade-offs and when to use one over the other. +-- diff --git a/book/chapters/part1.adoc b/book/chapters/part1.adoc new file mode 100644 index 00000000..1b262f58 --- /dev/null +++ b/book/chapters/part1.adoc @@ -0,0 +1,20 @@ +[[chapter-1]] += Algorithms Analysis + +[partintro] +-- +In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. +-- + + +:leveloffset: +1 + +// (g) +include::algorithms-analysis.adoc[] + +// (g) +include::big-o-examples.adoc[] + +:leveloffset: -1 + + diff --git a/book/chapters/part2.adoc b/book/chapters/part2.adoc new file mode 100644 index 00000000..7bc821d0 --- /dev/null +++ b/book/chapters/part2.adoc @@ -0,0 +1,29 @@ +[[chapter-2]] += Linear Data Structures + +// (g) +include::linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::array.adoc[] + +// (g) +<<< +include::linked-list.adoc[] + +// (g) +<<< +include::stack.adoc[] + +// (g) +<<< +include::queue.adoc[] + +// (g) +<<< +include::linear-data-structures-outro.adoc[] + +:leveloffset: -1 + diff --git a/book/chapters/part3.adoc b/book/chapters/part3.adoc new file mode 100644 index 00000000..f64d9d2f --- /dev/null +++ b/book/chapters/part3.adoc @@ -0,0 +1,63 @@ +[[chapter-3]] += Non-Linear Data Structures + +// (g) +include::non-linear-data-structures-intro.adoc[] + +:leveloffset: +1 + +// (g) +include::tree.adoc[] + + +// (g) +<<< +include::tree-binary-search-tree.adoc[] + +<<< +include::tree-search.adoc[] + +<<< +include::tree-self-balancing-rotations.adoc[] + +:leveloffset: +1 + +<<< +include::tree-avl.adoc[] + +:leveloffset: -1 + +// (g) +include::map.adoc[] + +// (g) +include::set.adoc[] + +// (g) +include::graph.adoc[] + +include::graph-search.adoc[] + +// Graph summary += Summary + +In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. +(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) + +// tag::table[] +.Time and Space Complexity for Non-Linear Data Structures +|=== +.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity +^|_Index/Key_ ^|_Value_ +| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) +| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +|=== +{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. +// end::table[] + +:leveloffset: -1 diff --git a/book/chapters/part4.adoc b/book/chapters/part4.adoc new file mode 100644 index 00000000..2494091a --- /dev/null +++ b/book/chapters/part4.adoc @@ -0,0 +1,62 @@ +[[chapter-4]] += Algorithmic Techniques + +// TODO: pending +include::algorithms-intro.adoc[] + +:leveloffset: +1 + +include::sorting-intro.adoc[] + +:leveloffset: +1 + +include::sorting-properties.adoc[] + + +// Slow Sorting +<<< +include::bubble-sort.adoc[] + +<<< +include::insertion-sort.adoc[] + +<<< +include::selection-sort.adoc[] + + +// include::insertion-selection-bubble-sort.adoc[] + +// Fast Sorting +<<< +include::merge-sort.adoc[] + +<<< +include::quick-sort.adoc[] + +<<< +include::sorting-summary.adoc[] + +:leveloffset: -1 + + +// +// Algorithms Techniques +// +<<< +include::divide-and-conquer.adoc[] + +<<< +include::dynamic-programming.adoc[] + +<<< +include::greedy-algorithms.adoc[] + +<<< +include::backtracking.adoc[] + +<<< +include::algorithmic-toolbox.adoc[] + +// --- end algorithms --- + +:leveloffset: -1 diff --git a/book/content/preface.asc b/book/chapters/preface.adoc similarity index 85% rename from book/content/preface.asc rename to book/chapters/preface.adoc index 7f983404..86222879 100644 --- a/book/content/preface.asc +++ b/book/chapters/preface.adoc @@ -1,26 +1,26 @@ [preface] -== Preface += Preface -=== What is in this book? +== What is in this book? -_{doctitle}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or looking for ideas to solve a problem optimally. (Check out the <> and <>) +_{book-title}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or looking for ideas to solve a problem optimally. (Check out the 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 CDZHfs diff --git a/book/content/dedication.asc b/book/content/dedication.asc deleted file mode 100644 index 2d833fbf..00000000 --- a/book/content/dedication.asc +++ /dev/null @@ -1,4 +0,0 @@ -[dedication] -== Dedication - -_To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail._ diff --git a/book/content/introduction.asc b/book/content/introduction.asc deleted file mode 100644 index cec2cb11..00000000 --- a/book/content/introduction.asc +++ /dev/null @@ -1,59 +0,0 @@ -[preface] -== Introduction - -You are about to become a better programmer and grasp the fundamentals of Algorithms and Data Structures. -Let's take a moment to explain how are we going to do that. - -This book is divided in 4 main parts.... - -In *Chapter 1*, we're going to cover Version Control Systems (VCSs) and Git basics -- no technical stuff, just what Git is, why it came about in a land full of VCSs, what sets it apart, and why so many people are using it. -Then, we'll explain how to download Git and set it up for the first time if you don't already have it on your system. - -In *Chapter 2*, we will go over basic Git usage -- how to use Git in the 80% of cases you'll encounter most often. -After reading this chapter, you should be able to clone a repository, see what has happened in the history of the project, modify files, and contribute changes. -If the book spontaneously combusts at this point, you should already be pretty useful wielding Git in the time it takes you to go pick up another copy. - -*Chapter 3* is about the branching model in Git, often described as Git's killer feature. -Here you'll learn what truly sets Git apart from the pack. -When you're done, you may feel the need to spend a quiet moment pondering how you lived before Git branching was part of your life. - -*Chapter 4* will cover Git on the server. -This chapter is for those of you who want to set up Git inside your organization or on your own personal server for collaboration. -We will also explore various hosted options if you prefer to let someone else handle that for you. - -*Chapter 5* will go over in full detail various distributed workflows and how to accomplish them with Git. -When you are done with this chapter, you should be able to work expertly with multiple remote repositories, use Git over email and deftly juggle numerous remote branches and contributed patches. - -*Chapter 6* covers the GitHub hosting service and tooling in depth. -We cover signing up for and managing an account, creating and using Git repositories, common workflows to contribute to projects and to accept contributions to yours, GitHub's programmatic interface and lots of little tips to make your life easier in general. - -*Chapter 7* is about advanced Git commands. -Here you will learn about topics like mastering the scary 'reset' command, using binary search to identify bugs, editing history, revision selection in detail, and a lot more. -This chapter will round out your knowledge of Git so that you are truly a master. - -*Chapter 8* is about configuring your custom Git environment. -This includes setting up hook scripts to enforce or encourage customized policies and using environment configuration settings so you can work the way you want to. -We will also cover building your own set of scripts to enforce a custom committing policy. - -*Chapter 9* deals with Git and other VCSs. -This includes using Git in a Subversion (SVN) world and converting projects from other VCSs to Git. -A lot of organizations still use SVN and are not about to change, but by this point you'll have learned the incredible power of Git -- and this chapter shows you how to cope if you still have to use a SVN server. -We also cover how to import projects from several different systems in case you do convince everyone to make the plunge. - -*Chapter 10* delves into the murky yet beautiful depths of Git internals. -Now that you know all about Git and can wield it with power and grace, you can move on to discuss how Git stores its objects, -what the object model is, details of packfiles, server protocols, and more. -Throughout the book, we will refer to sections of this chapter in case you feel like diving deep at that point; but if you are like us and want to dive into the technical details, you may want to read Chapter 10 first. -We leave that up to you. - -In *Appendix A*, we look at a number of examples of using Git in various specific environments. -We cover a number of different GUIs and IDE programming environments that you may want to use Git in and what is available for you. -If you're interested in an overview of using Git in your shell, your IDE, or your text editor, take a look here. - -In *Appendix B*, we explore scripting and extending Git through tools like libgit2 and JGit. -If you're interested in writing complex and fast custom tools and need low-level Git access, this is where you can see what that landscape looks like. - -Finally, in *Appendix C*, we go through all the major Git commands one at a time and review where in the book we covered them and what we did with them. -If you want to know where in the book we used any specific Git command you can look that up here. - -Let's get started. diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc deleted file mode 100644 index 4739c624..00000000 --- a/book/content/part03/time-complexity-graph-data-structures.asc +++ /dev/null @@ -1,25 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -=== Summary - -In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. -(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) - -// tag::table[] -.Time and Space Complexity for Graph-based Data Structures -|=== -.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity -^|_Index/Key_ ^|_Value_ -| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) -| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -|=== -{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. -// end::table[] diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc deleted file mode 100644 index 411c6f45..00000000 --- a/book/content/part04/dynamic-programming.asc +++ /dev/null @@ -1,62 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -=== Dynamic Programming - -(((Dynamic Programming))) -(((Algorithmic Techniques, Dynamic Programming))) -Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. - -// https://twitter.com/amejiarosario/status/1103050924933726208 -// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson -// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 -// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem - -.How to explain dynamic programming to kids? 👶 -**** - -$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ - ---{sp} What's that equal to? - ---{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! - ---{sp} Add another "+1". What's the total now? - ---{sp} $$*$$*_Quickly_*$$*$$ Eleven! - ---{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." -**** - -==== Fibonacci Sequence with Dynamic Programming -(((Fibonacci))) -Let's solve the same Fibonacci problem but this time with dynamic programming. - -When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. - -.Recursive Fibonacci Implemenation using Dynamic Programming -[source, javascript] ----- -include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] ----- - -This implementation checks if we already calculated the value, if so it will save it for later use. - -[graphviz, Recursive-Fibonacci-call-tree-with-dp, png] -.... -graph G { - "fib(5)" -- { "fib(4)" } - "fib(4)" -- { "fib(3)" } - "fib(3)" -- { "fib(2)" } - "fib(2)" -- { "fib(1)", "fib(0)" } -} -.... - -This graph looks pretty linear now. It's runtime _O(n)_! -(((Linear))) -(((Runtime, Linear))) - -(((Memoization))) -TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/content/part04/greedy-algorithms.asc b/book/content/part04/greedy-algorithms.asc deleted file mode 100644 index c28abd6e..00000000 --- a/book/content/part04/greedy-algorithms.asc +++ /dev/null @@ -1,105 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -=== Greedy Algorithms - -(((Greedy Algorithms))) -(((Algorithmic Techniques, Greedy Algorithms))) -Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. -They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. - -An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. - -[graphviz, Find-the-largest-sum, png] -.... -graph G { - 5 -- 3 [color="#B8E986", penwidth=2] - 5 -- 7 [color="#FF5252", penwidth=2] - 3 -- 87 [color="#B8E986", penwidth=2] - 3 -- 1 - 7 -- 2 - 7 -- 4 [color="#FF5252", penwidth=2] - - label="Optimal vs. Greedy path" -} -.... - -Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. - -Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. - -[TIP] -======= -Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. -This algorithm only gives one shot at finding the solution and never goes back to consider other options. -======= - -Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. - -.Some examples of greedy algorithms that works well: -- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. -- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. -indexterm:[Merge Sort] - - -.In general, we can follow these steps to design Greedy Algorithms: -1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). -2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. -3. Reduce the processed input and repeat step #1 and #2 until all data is gone. -4. Return solution. -5. Check correctness with different examples and edge cases. - -==== Fractional Knapsack Problem - -We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: - -> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? - -Let's say we have the following items available. - -.Knpasack Input -[source, javascript] ----- -const items = [ - { value: 1, weight: 1}, - { value: 4, weight: 3 }, - { value: 5, weight: 4 }, - { value: 7, weight: 5 }, -]; - -const maxWeight = 7; ----- - -So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. - -How would you solve this problem? - -First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: - -- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. - -- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# - -- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# - -.Items value/weight ratio ----- - { value: 1, weight: 1 }, // 1/1 = 1 - { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ - { value: 5, weight: 4 }, // 5/4 = 1.25 - { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ ----- - -Let's implement this algorithm! - -.Factional Knapsack Problem Implementation -[source, javascript] ----- -include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] ----- - -What's the runtime of this algorithm? - -We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc deleted file mode 100644 index 878029ab..00000000 --- a/book/content/part04/sorting-algorithms.asc +++ /dev/null @@ -1,142 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../../ -:codedir: ../../../src -endif::[] - -=== Sorting Algorithms - -Sorting is one of the most common solutions when we want to extract some insights about a collection of data. -We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. - -.We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: -- <> -- <> -- <> - -.and then discuss efficient sorting algorithms _O(n log n)_ such as: -- <> -- <> - -Before we dive into the most well-known sorting algorithms, let's discuss the sorting properties. - -==== Sorting Properties - -Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. - -Sorting properties are stable, adaptive, online and in-place. Let's go one by one. - -===== Stable -(((Sorting, stable))) -An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. - -This especially useful when you want to sort on multiple phases. - -.Let's say you have the following data: -[source, javascript] ----- -const users = [ - { name: 'Bob', age: 32 }, - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Charly', age: 32 }, -]; ----- - -.If you sort by `name` you would have: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, - { name: 'Don', age: 30 }, -]; ----- - -Then, here comes the _critical_ part, if you sort by `age` you might get (at least two) different results. - -.If the sorting algorithm is *stable*; it should keep the items with the same age ordered by `name`: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, -]; ----- - -.However, if the sorting is *not stable*, then you will lose the relative order of the items and get something like this: -[source, javascript] ----- -[ - { name: 'Don', age: 30 }, - { name: 'Alice', age: 30 }, - { name: 'Charly', age: 32 }, - { name: 'Bob', age: 32 }, -]; ----- - -Both results are sorted by `age`; however, having a stable sorting is better if you want to keep the relative position of data with the same value. - -===== In-place -(((Sorting, in-place))) -An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. -No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. - -===== Online -(((Sorting, online))) -It can sort a list as it receives it. -((Online sorting)) algorithms don't have to re-sort the whole collection for every new item added. - -===== Adaptive -(((Sorting, adaptive))) -Algorithms with ((adaptive sorting)) run faster, close to _O(n)_, on an already sorted (or partially sorted) collection. - -<<< -include::bubble-sort.asc[] - -<<< -include::insertion-sort.asc[] - -<<< -include::selection-sort.asc[] - -<<< -include::merge-sort.asc[] - -<<< -include::quick-sort.asc[] - -<<< -==== Summary - -We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. -(((Tables, Algorithms, Sorting Complexities))) -(((Tables, Algorithms, Sorting Summary))) - -// tag::table[] -.Sorting algorithms comparison -[cols="20,80"] -|=== -| Algorithms | Comments -| <> | Swap pairs bubbling up largest numbers to the right -| <> | Look for biggest number to the left and swap it with current -| <> | Iterate array looking for smallest value to the right -| <> | Split numbers in pairs, sort pairs and join them in ascending order -| <> | Choose a pivot, set smaller values to the left and bigger to the right. -// | Tim sort | Hybrid of merge sort and insertion sort -|=== - -.Sorting algorithms time/space complexity and properties -|=== -| Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No -| <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No -| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No -// | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes -|=== -// end::table[] - diff --git a/book/images/cover-a42.png b/book/cover.png similarity index 100% rename from book/images/cover-a42.png rename to book/cover.png diff --git a/book/custom-variables.adoc b/book/custom-variables.adoc new file mode 100644 index 00000000..27b4c054 --- /dev/null +++ b/book/custom-variables.adoc @@ -0,0 +1,2 @@ +:imagesdir: {docdir}/images +:codedir: ../../src diff --git a/book/dsajs.asc b/book/dsajs.asc deleted file mode 100644 index 2e291afe..00000000 --- a/book/dsajs.asc +++ /dev/null @@ -1,65 +0,0 @@ -DSA.js -======= -Adrian Mejia -:doctitle: Data Structures & Algorithms in JavaScript -:doctype: book -:author: Adrian Mejia -:email: hello+dsajs@adrianmejia.com -:producer: {author} -:subject: Algorithms -:keywords: dsa.js, Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees -:revdate: {docdate} -:docinfo: -:toc: -:toclevels: 2 -:pagenums: -:front-cover-image: image:cover.png[width=1050,height=1600] -:icons: font -// -// custom variables (no blank lines) -// -:codedir: ../../../src -:imagesdir: images -// -// highlighter -:source-highlighter: rouge -// :source-highlighter: coderay -// :source-highlighter: pygments -// :pygments-style: pastie -// -// PDF -:pdf-fontsdir: fonts -:pdf-stylesdir: _resources/pdfstyles -:pdf-style: adrian-screen -// -// :stem: -// :plantuml-config: ./config/_conf/umlconfig.txt -// --- - -ifdef::ebook-format[:leveloffset: -1] - -include::content/colophon.asc[] - -include::content/dedication.asc[] - -include::content/preface.asc[] - -// include::content/introduction.asc[] - -include::part01-algorithms-analysis.asc[] - -include::part02-linear-data-structures.asc[] - -include::part03-graph-data-structures.asc[] - -include::part04-algorithmic-toolbox.asc[] - -include::A-time-complexity-cheatsheet.asc[] - -include::B-self-balancing-binary-search-trees.asc[] - -include::C-AVL-tree.asc[] - -include::index.asc[] - -// ifndef::ebook-format[include::index.asc[]] diff --git a/book/images/Find-the-largest-sum.png b/book/images/Find-the-largest-sum.png deleted file mode 100644 index aaf93568dae70b0b3bf0e5c90ddc6f896a0e153d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16292 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 LD!eHbH}v~o`?myP diff --git a/book/images/Recursive-Fibonacci-call-tree-with-dp.png b/book/images/Recursive-Fibonacci-call-tree-with-dp.png deleted file mode 100644 index 06beb2e6f87af7fdfd16e8f7637db0b6b22710ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17827 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

jBp5^;l!*u%y-n! zA7Kom^9+f$sdZ1j<6)2^&w&|_nFlBJ2VP+I*EAFmxE2k<)uo&&Jt*(T?~Sfu?gS|@ zU^BST8zi*?mhzb&NJclOP7SiF>B*vli{JJ|(UHq%jS}&C{ns8=+H1N)@$nDE|Wb=qHf5 zQp#NJWDCqv&1za0*!&IRKvKyHm>wBvdX-qgrO|_L$diFTzF`)*NhuP60YTgv_5NTb z3tW55<3GJvpPd1iK9Sqh9<}|n_5Na;?|F8Lr4|@020+H5<|4sfSxT(%(vHixe$eFR zyxbRNsM=;xO`}HMMh(2KAg0{|w;mWb`+mcSJVo4X3Col3e~({0tO!gox@*S~lAp_@ z+`#?D?8o!^&eaXQFd4+iubJ;khjQg_(Vf5$eE@tAQ(!!q!6%WcJzjo(s$%zc>^%GY;Wk?2u#g4u4`J{2&s%IjXHIZY|Q_VRp3+_ToutcE+? z#v;i!f}7bpPxTQs!X;Bq^{jj_r*xxD^ zrB$Bqk6V^UvcD4q{PG2LMCt(@crvzC>hl0wHweySGYICJQ_ww5UG2smk*zH4rf+`3 zTP7eZ=yB~?omkAtQ0@=lpWTp>JF5;lmYXupJv<|o#R4)7m5n&LPsu#X-^Zs0$z-uw zV#Tv#%#$QtW7gt#QG#*N;mAde>SGj^Q9l@`=I!f%wTNQiA6maIRQrmlz~XvbBnIQ{ z2lj^IZ)>5Ov8bNkWxkoMIS||QkhZqHrPpYPakBJOw``g`M6m!PH~t`z2JIMRBzLgL zrmsG_JKvjcZF%Wz4Rjc-CZBn}2_lEJ=9su+alJX=7Z`8VqK=k~LhMgGEU1^fx+2IV|I^gru`Q_}JZo-gx}qgXxnR*?9tI3IiWvHL#xSFzU5 zut;sLPnJf*#4D3uY?;#LN3TVezM!AP->tH*X$p6do!_eK`G16=YTRY-ebT&TqnX<1Zo%Ely<_`~Qhf)NeYI%2!;o+!zj)|i4nu=s(%BE5%WsT#1c_6Qn&vhIo_C*xj{aUE>E%UiV^E6 z7A{-N&Ie1Dvf5IH&pZgLIdTM5-xrxCn;!H^nPEPRB`sP5my3%17w!$b(W@1-4-y?+ zocp-U#vzQ7pH*p@-f5c+ghI>)<}Ke%qi#;S&cwc=AG=54TZn5%>7RafsES!D*^<;| z0-lE;Rl{h9(xSrD$$VlUt;0@PaCrF(u8pT zFj4;x4Gj2le*qq$RXhB3*5ZHDE#Yqx47>i?+PNEJu^|`ZB2bL7`U7!Xy@D$ z9`z$Z(YVcw42ow+i_8B}eb6@=9$J2O zAcS5P5G7VUz~8+{>sx1kq-VyaDtUg`hBmlb7>|>2%jbwnfh@(<*#<_B9~~)baed%C z&wJqgZ5p~iehw#)y!v-U6=c5o#wz7$Ab>LX)Yq0+NM~Bpq1V>C`Va?Zzu0sj&Cg-~ z=VWcjnW=MX*7~0LV99%-gfy|s56!;-7EG<+lpyT;J0MpBgVE_OC diff --git a/book/images/cover-a41.png b/book/images/cover-a41.png deleted file mode 100644 index 1e1b5d4d6760e82c1bc7676b37957dad6a0ae4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51986 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

Z&eiEV<5oJLb^o7eq>fxxyQ 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�l3;0hIf6BUg1p7#1&2ulnCw`-!5)K_chz#*HQK;q74GB;Hk0dyIpoGcpQq2; z>!>!=8%QIrDG1DS?QygEB1K3;sn_au(x$~0yQbXe)C8SUn6XLc&uhCiE}qI}g>)px z7J{I+!l|=hz1TwU@t5H2{S~S7o?!tCNydn1-4-|!3Fs|Ty_4tIvF^-kL^xUzdDF53 z_BZa+wri!-$>crlU@Mz^-~6NIrvyRpWq&&)&-x12Icwqur8rL@A{Fr#LzKoa9A z7s)tEVjVT@pLTliM)j&>6kwOmHs~u~D^WpPply(kJc;x^^WUs&_d&MfF~kN!EJtV@ zIN3v<(QkLqJX{|WTr2O&Cja*Bnxj|at@#?f?PUcdK1-GhwIf42j$D|XK$z?+_V0lg zn&?KD4Yx{G;#jv`$&>-{~j!~n*->@g$u8lSW1peH^=2hWJ(T7*p z5-ZCT&Q2fOC0nrKQY<^qzs2XS(0w^6C|D5?t+tL#$g?my!j{n!>qYZyhjN2I;g;Wc`kYIeGGj{A zMuzw1=}KZh4&?`LR#DuFb>u~#-XugIz?L$$9j8soF|S;5^N+18-{@YI3W0pcPYfcqgZlR^w@gK=Zp)0lzu=&|aDih+(m&AO zJ9LFJ3s-9qq-+dfFf)MoR5~K?mtnSULmTf�-Ann~fCk5YX!%1mm#lz;B?8Dk1`$ zuPHQ;nBY+u<43oj-}2Csfx1#NN*qS_Ok07HbowIf)J2p#2iAn73X3|Maj&-o}=!kq6_Y3THoZc zp)zuf#yMnMdL*F)5Lr6jY+^Axc?=FJa6TJ+*w#xM&~HlA?#@CFhaL0%q4QoG#>ojm z3NmhsK=tRy>s?^#^2vLu7(SV^5p%K|9g|WoPCpyYOC+Eb&GpG-iyiEnf-Bhz1rAJ3 zTsBu}IM}9yhNQNT#@*rH48j0e*@L*soQY!G#Gqcz&_$my=!ujH#`~uq%4PW#KWs0cUhOz72b;?_p?A z0dz#RWz*N*51GvxK0{xz7X1dj%Qc^8B&#DPv+sAsW%V9QZX1+@4bFput7#BJd!peR z6jH<+PrDu@unH9P=%Clu?ps3dS$5Y_`*&q=CVjhRte+q6u6ewEbo4vzgf6N8aVfhp zvGws{v@c}&yy1horCs-voA&nSOXC#WrG^~;Lj*S)jXgvJ3f{G~)&0#BGyt{OXNf4q zg<)X!o8~C_*!TgF0yQ!n{Y|NB6oAHAV&0k)I>qO;KzXuuaw4B|C?z|GsVQ< z>J8yg4OUw_MUIHb;rEaWn46 z;n^gV6&AuCpHZjkHuy32PCr3vkPi9EGc`KXHB2GpLh1a-?ZfR++#ZzNX)Nd7P+V_Z3*C)&LwH1{eK1lXV$9m4?1|%aFkQNh=kFN z(>Qp9{jG2Ja6x%9AGBxmCS*l0RM&#iX#abEDnJct{e=qXPXeo`hJjbsBeQ+Tj^wny zOMyWA`u7|LP=|+wI*krn*o`6sQoRkAzR9NMv%_Buu`yoK>9@0COkzz>xEyt^D_@)fw7`!a5xVW|3NLP4ikY z7=(iMpT)8vWR29`=dv_@31-l>8~*U(Ebb8hugFqDV4%GZ1f*#@cn2DpR;F0y!7uF1 zEo3dy|E`+?RceFHG;9LU*A_nRIXUGKEXm5>g9d;$X+XDYHo>Cf35R5O&!4SB)Bn*G z@KX`a`zb%nR1rzDi5!G-Cx%+ z5O?nP-Dj1B^uM_X0)j`yeABJ2eKX>R(k2U;w8O zOs=7v|9(y-gJo&K`YiC@3ujW{J<-tgRKQndP976Z@Xh|kBqR=G{Ccq|6S9O|)XS<) zV?it-k$FD&Be>8;$dC4TQS|95VM>obkv!II3fSEZ3|b7i{on%2C6`)})^upCId=}) z7&n#pP-yo zH!dB$AOV>xxum!}@!roI--uLQ#t{56%~DWTA-a~DZFi7D_r0QVf#+s#%Hp>455rUb z!uiVihqx+_T_jDOTSxs4jGx3}`wciaVH*Lof4|-SFZNKleXFIu9 z2r_^8S~lBVUzYYgdx2-8mcilo8gTG)BU+^d99mZ0@2F#adlO11@;)&;yNa4J6TERLI+y}#XJ#Zz3$5B<}zkH7CWp-HxT zzK*^zvp*zy+^y%nN(Dak6-p9d(GY2Dw5+s~ezCuM6tW(2DM|vp&27 z*$Y_8T@xg>0_t%M_Du|kzMDxXT43#Lmvw?fZ9Ar2f{H!+^r^7{f)SX?%1ZjBWJ^Q% z$@03!`9G?S75e)6Ivr@Y7W=N3jZ;?@(}e}j#VvJ-E=ND^(TW7Ve_Hd1R1v(&VCXt# z+72o!brvg2#5k(T9GjNIvt{FOZK52t+G}@|wW35>8O+;fjNq+CGHqhMsd-WiIPB|Bvrk)proB z>|J8}5zU)!LOP#pPaPJUSovJ ziKNOkd3vebmbmL(=|rv8S?s!BE%pV=g*e|Cr99PLk|V4vWW z`U4;F@nE|LN1~4Ux6{3}TRV6p-fNS>Yt7?AnC94Vd$#WW!5)?!gm@;mrO)hl+^H&ylogVvH?|McS+iOtIKN_BtGk1C6_dc68z`Dhx* zE}LEYY_>44()9jQ_L@>*17A&k3~M)ZVS_#K{>$A1t8IQ|94Eve*rMl0bfIo@Re;BP zb~Rp?7WT;$OM=WkBDg@(ufOOy*M1PW!A`Ne@ob^)-%L%j?rC⁡Zrd-<1$wcCyQ6 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 CDZHfs diff --git a/book/images/directed-graph.png b/book/images/directed-graph.png deleted file mode 100644 index 8a6979162ba03d79e55f9ff8c8f8a4e8e5c6bea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16746 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 diff --git a/book/images/recursive-fibonacci-call-tree.png b/book/images/recursive-fibonacci-call-tree.png deleted file mode 100644 index 9e18a2ab7e050308393102aa9cc8922d5c0a7baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52743 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%0Dq?o%c)^!oBrA2&6E*^ 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 Yr8BcFzjC?92nGJhN-9c}i5d9*KL_kY%m4rY diff --git a/book/index.asc b/book/index.asc deleted file mode 100644 index 4312be40..00000000 --- a/book/index.asc +++ /dev/null @@ -1,5 +0,0 @@ -[index] -[[index]] -== Index - -ifndef::backend-pdf[Topical index only available on the PDF version.] diff --git a/book/lab/greetings.pdf b/book/lab/greetings.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fab4624f7ebc4a8bea88e0c4462e851531aa98d7 GIT binary patch literal 10630 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 M5_m8g&A!ax59Y)4;{X5v literal 0 HcmV?d00001 diff --git a/book/part01-algorithms-analysis.asc b/book/part01-algorithms-analysis.asc deleted file mode 100644 index aefd21c1..00000000 --- a/book/part01-algorithms-analysis.asc +++ /dev/null @@ -1,12 +0,0 @@ -[[part01-algorithms-analysis]] -== Algorithms Analysis - -In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. - -include::content/part01/algorithms-analysis.asc[] - -include::content/part01/big-o-examples.asc[] - -=== Summary - -Lorem ipsum dolor sit, amet consectetur adipisicing elit. Aut, optio harum. Rem assumenda iste est delectus quas corporis tenetur esse neque id officia expedita porro sit, totam rerum illo cupiditate. diff --git a/book/part03-graph-data-structures.asc b/book/part03-graph-data-structures.asc deleted file mode 100644 index baebfd0e..00000000 --- a/book/part03-graph-data-structures.asc +++ /dev/null @@ -1,38 +0,0 @@ -[[part03-graph-data-structures]] -== Graph Data Structures - -Graph-based data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. - -.In this chapter we are going to learn: -- Exciting <> data structure applications -- Searching efficiently with a <> data structures. -- One of the most versatile data structure of all <>. -- Keeping dups out with a <>. -By the end of this section, you will know the data structures trade-offs and when to use one over the other. - -include::content/part03/tree-intro.asc[] - -<<< -include::content/part03/binary-search-tree.asc[] - -<<< -include::content/part03/tree-search-traversal.asc[] - -<<< -include::content/part03/binary-search-tree-traversal.asc[] - -<<< -include::content/part03/map.asc[] - -<<< -include::content/part03/set.asc[] - -<<< -include::content/part03/graph.asc[] - -<<< -include::content/part03/graph-search.asc[] - -<<< -include::content/part03/time-complexity-graph-data-structures.asc[] - diff --git a/book/sample-o.adoc b/book/sample-o.adoc new file mode 100644 index 00000000..983c90fa --- /dev/null +++ b/book/sample-o.adoc @@ -0,0 +1,47 @@ +include::_conf/variables.adoc[] + += {doctitle} + +// remove numbering from titles, and sub-titles e.g. 1.1 +:sectnums!: + +// Copyright © 2018 Adrian Mejia (g) +include::chapters/colophon.adoc[] + +// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle +// but level-1 in PDF and HTML +// ifndef::backend-epub3[:leveloffset: +1] +// include::chapters/dedication.adoc[] +// ifndef::backend-epub3[:leveloffset: -1] +include::chapters/dedication.adoc[] + +// (g) +include::chapters/preface.adoc[] + +// add sections to chapters +:sectnums: + + +//----------------------------------- +// TODO: commment out sample on final +//----------------------------------- + +include::chapters/sample.adoc[] + +//----------------------------------- +// TODO: end remove ------ +//----------------------------------- + + +// --- end algorithms --- + + +// +// end chapters +// +:sectnums!: + +include::chapters/epigraph.adoc[] + +[index] += Index diff --git a/book/sample.adoc b/book/sample.adoc new file mode 100644 index 00000000..cda039b7 --- /dev/null +++ b/book/sample.adoc @@ -0,0 +1,70 @@ += Data Structures and Algorithms Explained in JavaScript +:book-title: {doctitle} +:author: Adrian Mejia +:email: hello+dsajs@adrianmejia.com +:revnumber: 1.0.0 +:revdate: {docdate} +:revyear: 2019 +:revremark: First Edition +:subject: Algorithms +:keywords: Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees +:doctype: book +:media: screen +:imagesdir: {docdir}/images +ifeval::["{media}" != "prepress"] +:front-cover-image: image:cover.png[Front Cover,1050,2600] +endif::[] +:toc: +:toclevels: 3 +:icons: font +:lang: en +:language: javascript +:experimental: +:pdf-fontsdir: ./fonts +:pdf-stylesdir: ./_resources/pdfstyles +:pdf-style: adrian-screen +:title-logo-image: image:logo.png[Logo,50,50] + +// custom variables +:codedir: ../../src +:datadir: {docdir}/data +:source-highlighter: pygments +:pygments-style: xcode + + +ifndef::ebook-format[:leveloffset: 1] + +[colophon#colophon%nonfacing] +include::chapters/colophon.adoc[] + +[dedication] +include::chapters/dedication.adoc[] + +// [%nonfacing] +// include::chapters/acknowledgements.adoc[] + +[preface] +include::chapters/preface.adoc[] + +// include::chapters/introduction.adoc[] + +include::chapters/chapter1.adoc[] + +include::chapters/sample.adoc[] + +// include::chapters/chapter2.adoc[] + +// include::chapters/chapter3.adoc[] + +// include::chapters/chapter4.adoc[] + +include::chapters/appendix.adoc[] + +// include::chapters/epigraph.adoc[] + +// include::chapters/about.adoc[] + +ifdef::backend-pdf,backend-docbook[] +[index] += Index +endif::[] diff --git a/deprecated-README.adoc b/deprecated-README.adoc index f0ff9d83..7c8d8136 100644 --- a/deprecated-README.adoc +++ b/deprecated-README.adoc @@ -3,8 +3,8 @@ :toclevels: 2 Adrian Mejia -image::https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] -image::https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] +image:https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] +image:https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] This repository covers the implementation of the classical algorithms and data structures in JavaScript. @@ -18,12 +18,12 @@ toc::[] - Algorithm analysis fundamentals (Big O notation, Time/Space complexity) and examples. - Time/space complexity cheatsheet. -image::book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] +image:book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] == Data Structures We are covering the following data structures. -image::https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] +image:https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] ### Linear Data Structures 1. **Arrays**: Built-in in most languages so not implemented here. https://adrianmejia.com/blog/2018/04/28/data-structures-time-complexity-for-beginners-arrays-hashmaps-linked-lists-stacks-queues-tutorial/#Array[Post]. diff --git a/package-lock.json b/package-lock.json index d285e8d5..109eacb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.0", + "version": "1.2.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -887,12 +887,14 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "fill-range": "^7.0.1" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-process-hrtime": { @@ -1131,9 +1133,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, @@ -1741,9 +1743,9 @@ } }, "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, "esquery": { @@ -1822,30 +1824,6 @@ "dev": true, "requires": { "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } } }, "expect": { @@ -1978,23 +1956,16 @@ } }, "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==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-up": { @@ -2085,8 +2056,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2107,14 +2077,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2129,20 +2097,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2259,8 +2224,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2272,7 +2236,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2287,7 +2250,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2295,14 +2257,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2321,7 +2281,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2402,8 +2361,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2415,7 +2373,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2501,8 +2458,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2538,7 +2494,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2558,7 +2513,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2602,14 +2556,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -2718,12 +2670,12 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { - "neo-async": "^2.6.0", + "async": "^2.5.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" @@ -3097,10 +3049,13 @@ } }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } }, "is-path-cwd": { "version": "1.0.0", @@ -3760,9 +3715,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3983,9 +3938,9 @@ } }, "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, "mem": { @@ -4031,19 +3986,6 @@ "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - } } }, "mime-db": { @@ -4176,12 +4118,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4716,9 +4652,9 @@ "dev": true }, "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -5936,13 +5872,13 @@ "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.17.1", "source-map": "~0.6.1" }, "dependencies": { diff --git a/package.json b/package.json index ef2c1365..be0d9469 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.0", + "version": "1.2.3", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -31,17 +31,11 @@ "dependencies": {}, "devDependencies": { "benchmark": "2.1.4", - "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", - "jest": "23.6.0", - "braces": ">=2.3.1", - "handlebars": ">=4.0.14", - "js-yaml": ">=3.13.1", - "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { From f592ff87a0a1424cd3062b5f8b0295bb99dc1786 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 06:28:58 -0400 Subject: [PATCH 003/200] Revert "Revert "build(book): optimize for different formats"" This reverts commit b1abab121a6263cc5ec0ce9ca1474f23ed6eb4d8. --- .circleci/config.yml | 2 +- .gitignore | 15 +- README.md | 101 ++--- book/A-time-complexity-cheatsheet.asc | 39 ++ ... B-self-balancing-binary-search-trees.asc} | 35 +- .../tree-avl.adoc => C-AVL-tree.asc} | 25 +- book/book-all.adoc | 155 -------- book/book-o.adoc | 194 ---------- book/book.adoc | 84 ---- book/ch02-git-basics-chapter.asc | 35 ++ book/chapters/about.adoc | 1 - book/chapters/acknowledgements.adoc | 1 - book/chapters/action.adoc | 4 - book/chapters/appendix.adoc | 3 - book/chapters/avl-tree.adoc | 5 - book/chapters/cheatsheet.adoc | 38 -- book/chapters/dedication.adoc | 5 - book/chapters/divide-and-conquer-intro.adoc | 17 - book/chapters/divide-and-conquer.adoc | 9 - .../dynamic-programming-fibonacci.adoc | 35 -- book/chapters/dynamic-programming-intro.adoc | 30 -- .../dynamic-programming-knapsack-problem.adoc | 52 --- book/chapters/dynamic-programming.adoc | 16 - book/chapters/epigraph.adoc | 4 - book/chapters/greedy-algorithms-intro.adoc | 50 --- .../greedy-algorithms-knapsack-problem.adoc | 57 --- book/chapters/greedy-algorithms.adoc | 9 - book/chapters/heap-sort.adoc | 7 - book/chapters/heap.adoc | 3 - book/chapters/index.adoc | 2 - .../insertion-selection-bubble-sort.adoc | 3 - book/chapters/map-intro.adoc | 26 -- book/chapters/map.adoc | 18 - .../non-linear-data-structures-intro.adoc | 12 - book/chapters/part1.adoc | 20 - book/chapters/part2.adoc | 29 -- book/chapters/part3.adoc | 63 --- book/chapters/part4.adoc | 62 --- book/chapters/red-black-tree.adoc | 3 - book/chapters/sample.adoc | 359 ------------------ book/chapters/sorting-intro.adoc | 20 - book/chapters/sorting-properties.adoc | 78 ---- book/chapters/sorting-summary.adoc | 35 -- book/chapters/timsort.adoc | 63 --- book/chapters/trie.adoc | 3 - book/config | 2 +- .../colophon.adoc => content/colophon.asc} | 5 +- book/content/cover.png | Bin 0 -> 114081 bytes book/content/dedication.asc | 4 + book/content/introduction.asc | 59 +++ .../part01/algorithms-analysis.asc} | 32 +- .../part01/big-o-examples.asc} | 107 +++--- .../array-vs-list-vs-queue-vs-stack.asc} | 22 +- .../array.adoc => content/part02/array.asc} | 32 +- .../part02/linked-list.asc} | 63 +-- .../queue.adoc => content/part02/queue.asc} | 17 +- .../stack.adoc => content/part02/stack.asc} | 19 +- .../part03/binary-search-tree-traversal.asc} | 12 +- .../part03/binary-search-tree.asc} | 36 +- .../part03/graph-search.asc} | 66 ++-- .../graph.adoc => content/part03/graph.asc} | 55 +-- .../part03/hashmap.asc} | 29 +- .../part03/map.asc} | 40 +- .../set.adoc => content/part03/set.asc} | 33 +- .../time-complexity-graph-data-structures.asc | 25 ++ .../part03/tree-intro.asc} | 47 +-- .../part03/tree-search-traversal.asc} | 30 +- .../part03/treemap.asc} | 13 +- .../part04/algorithmic-toolbox.asc} | 10 +- .../part04/backtracking.asc} | 16 +- .../part04/bubble-sort.asc} | 16 +- .../part04/divide-and-conquer.asc} | 32 +- book/content/part04/dynamic-programming.asc | 62 +++ book/content/part04/greedy-algorithms.asc | 105 +++++ .../part04/insertion-sort.asc} | 15 +- .../part04/merge-sort.asc} | 21 +- .../part04/quick-sort.asc} | 19 +- .../part04/selection-sort.asc} | 19 +- book/content/part04/sorting-algorithms.asc | 142 +++++++ .../preface.adoc => content/preface.asc} | 16 +- book/custom-variables.adoc | 2 - book/dsajs.asc | 65 ++++ book/images/Find-the-largest-sum.png | Bin 0 -> 16292 bytes .../Recursive-Fibonacci-call-tree-with-dp.png | Bin 0 -> 17827 bytes book/images/Words-Permutations.png | Bin 0 -> 47291 bytes book/images/cover-a41.png | Bin 0 -> 51986 bytes book/{cover.png => images/cover-a42.png} | Bin book/images/cover.png | Bin 104354 -> 114081 bytes book/images/directed-graph.png | Bin 0 -> 16746 bytes book/images/recursive-fibonacci-call-tree.png | Bin 0 -> 52743 bytes book/index.asc | 5 + book/lab/greetings.pdf | Bin 10630 -> 0 bytes book/lab/prawn_test.rb | 6 - book/lab/prawn_view.rb | 37 -- book/lab/test.pdf | Bin 946 -> 0 bytes book/part01-algorithms-analysis.asc | 12 + ...adoc => part02-linear-data-structures.asc} | 31 +- book/part03-graph-data-structures.asc | 38 ++ ...ro.adoc => part04-algorithmic-toolbox.asc} | 24 +- book/sample-o.adoc | 47 --- book/sample.adoc | 70 ---- deprecated-README.adoc | 8 +- package-lock.json | 176 ++++++--- package.json | 8 +- 104 files changed, 1311 insertions(+), 2266 deletions(-) create mode 100644 book/A-time-complexity-cheatsheet.asc rename book/{chapters/tree-self-balancing-rotations.adoc => B-self-balancing-binary-search-trees.asc} (84%) rename book/{chapters/tree-avl.adoc => C-AVL-tree.asc} (77%) delete mode 100644 book/book-all.adoc delete mode 100644 book/book-o.adoc delete mode 100644 book/book.adoc create mode 100644 book/ch02-git-basics-chapter.asc delete mode 100644 book/chapters/about.adoc delete mode 100644 book/chapters/acknowledgements.adoc delete mode 100644 book/chapters/action.adoc delete mode 100644 book/chapters/appendix.adoc delete mode 100644 book/chapters/avl-tree.adoc delete mode 100644 book/chapters/cheatsheet.adoc delete mode 100644 book/chapters/dedication.adoc delete mode 100644 book/chapters/divide-and-conquer-intro.adoc delete mode 100644 book/chapters/divide-and-conquer.adoc delete mode 100644 book/chapters/dynamic-programming-fibonacci.adoc delete mode 100644 book/chapters/dynamic-programming-intro.adoc delete mode 100644 book/chapters/dynamic-programming-knapsack-problem.adoc delete mode 100644 book/chapters/dynamic-programming.adoc delete mode 100644 book/chapters/epigraph.adoc delete mode 100644 book/chapters/greedy-algorithms-intro.adoc delete mode 100644 book/chapters/greedy-algorithms-knapsack-problem.adoc delete mode 100644 book/chapters/greedy-algorithms.adoc delete mode 100644 book/chapters/heap-sort.adoc delete mode 100644 book/chapters/heap.adoc delete mode 100644 book/chapters/index.adoc delete mode 100644 book/chapters/insertion-selection-bubble-sort.adoc delete mode 100644 book/chapters/map-intro.adoc delete mode 100644 book/chapters/map.adoc delete mode 100644 book/chapters/non-linear-data-structures-intro.adoc delete mode 100644 book/chapters/part1.adoc delete mode 100644 book/chapters/part2.adoc delete mode 100644 book/chapters/part3.adoc delete mode 100644 book/chapters/part4.adoc delete mode 100644 book/chapters/red-black-tree.adoc delete mode 100644 book/chapters/sample.adoc delete mode 100644 book/chapters/sorting-intro.adoc delete mode 100644 book/chapters/sorting-properties.adoc delete mode 100644 book/chapters/sorting-summary.adoc delete mode 100644 book/chapters/timsort.adoc delete mode 100644 book/chapters/trie.adoc rename book/{chapters/colophon.adoc => content/colophon.asc} (87%) create mode 100644 book/content/cover.png create mode 100644 book/content/dedication.asc create mode 100644 book/content/introduction.asc rename book/{chapters/algorithms-analysis.adoc => content/part01/algorithms-analysis.asc} (90%) rename book/{chapters/big-o-examples.adoc => content/part01/big-o-examples.asc} (82%) rename book/{chapters/linear-data-structures-outro.adoc => content/part02/array-vs-list-vs-queue-vs-stack.asc} (57%) rename book/{chapters/array.adoc => content/part02/array.asc} (94%) rename book/{chapters/linked-list.adoc => content/part02/linked-list.asc} (89%) rename book/{chapters/queue.adoc => content/part02/queue.asc} (93%) rename book/{chapters/stack.adoc => content/part02/stack.asc} (91%) rename book/{chapters/tree-binary-tree-traversal.adoc => content/part03/binary-search-tree-traversal.asc} (94%) rename book/{chapters/tree-binary-search-tree.adoc => content/part03/binary-search-tree.asc} (91%) rename book/{chapters/graph-search.adoc => content/part03/graph-search.asc} (65%) rename book/{chapters/graph.adoc => content/part03/graph.asc} (91%) rename book/{chapters/map-hashmap.adoc => content/part03/hashmap.asc} (95%) rename book/{chapters/map-hashmap-vs-treemap.adoc => content/part03/map.asc} (55%) rename book/{chapters/set.adoc => content/part03/set.asc} (91%) create mode 100644 book/content/part03/time-complexity-graph-data-structures.asc rename book/{chapters/tree.adoc => content/part03/tree-intro.asc} (77%) rename book/{chapters/tree-search.adoc => content/part03/tree-search-traversal.asc} (84%) rename book/{chapters/map-treemap.adoc => content/part03/treemap.asc} (94%) rename book/{chapters/algorithmic-toolbox.adoc => content/part04/algorithmic-toolbox.asc} (90%) rename book/{chapters/backtracking.adoc => content/part04/backtracking.asc} (93%) rename book/{chapters/bubble-sort.adoc => content/part04/bubble-sort.asc} (85%) rename book/{chapters/divide-and-conquer-fibonacci.adoc => content/part04/divide-and-conquer.asc} (61%) create mode 100644 book/content/part04/dynamic-programming.asc create mode 100644 book/content/part04/greedy-algorithms.asc rename book/{chapters/insertion-sort.adoc => content/part04/insertion-sort.asc} (81%) rename book/{chapters/merge-sort.adoc => content/part04/merge-sort.asc} (82%) rename book/{chapters/quick-sort.adoc => content/part04/quick-sort.asc} (88%) rename book/{chapters/selection-sort.adoc => content/part04/selection-sort.asc} (78%) create mode 100644 book/content/part04/sorting-algorithms.asc rename book/{chapters/preface.adoc => content/preface.asc} (85%) delete mode 100644 book/custom-variables.adoc create mode 100644 book/dsajs.asc create mode 100644 book/images/Find-the-largest-sum.png create mode 100644 book/images/Recursive-Fibonacci-call-tree-with-dp.png create mode 100644 book/images/Words-Permutations.png create mode 100644 book/images/cover-a41.png rename book/{cover.png => images/cover-a42.png} (100%) create mode 100644 book/images/directed-graph.png create mode 100644 book/images/recursive-fibonacci-call-tree.png create mode 100644 book/index.asc delete mode 100644 book/lab/greetings.pdf delete mode 100644 book/lab/prawn_test.rb delete mode 100644 book/lab/prawn_view.rb delete mode 100644 book/lab/test.pdf create mode 100644 book/part01-algorithms-analysis.asc rename book/{chapters/linear-data-structures-intro.adoc => part02-linear-data-structures.asc} (59%) create mode 100644 book/part03-graph-data-structures.asc rename book/{chapters/algorithms-intro.adoc => part04-algorithmic-toolbox.asc} (73%) delete mode 100644 book/sample-o.adoc delete mode 100644 book/sample.adoc diff --git a/.circleci/config.yml b/.circleci/config.yml index cd95bb19..a50b5c40 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -104,7 +104,7 @@ jobs: # a collection of steps - run: name: generate PDF - command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" pdf + command: cd book/config && make VERSION="$(npx -c 'echo "$npm_package_version"')" - store_artifacts: path: book/dist diff --git a/.gitignore b/.gitignore index fedfe47e..363ed4fe 100644 --- a/.gitignore +++ b/.gitignore @@ -72,7 +72,6 @@ local.properties # Ruby ###################### /.bundle/ -/Gemfile.lock ###################### # Package Files @@ -136,13 +135,13 @@ Desktop.ini # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/fonts . # ln -s ~/OneDrive/Authoring/dsaJS/asciidoc/book/images . ###################### -Gemfile -Gemfile.lock -Makefile -_conf -_resources -extensions -fonts +# Gemfile +# Gemfile.lock +# Makefile +# _conf +# _resources +# extensions +# fonts ###################### diff --git a/README.md b/README.md index 64c0d55a..1d399c45 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![Slack](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) -> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the [npm package](https://www.npmjs.com/package/dsa.js). +> This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. > In this repository, you can find the implementation of algorithms and data structures. They are implemented and explained in JavaScript. This material can be used as a reference manual for developers. You can refresh specific topics before an interview. Also, you can find ideas to solve problems more efficiently. @@ -21,7 +21,8 @@ https://img.shields.io/bundlephobia/min/dsa.js.svg - 16.7kB https://img.shields.io/github/repo-size/amejiarosario/dsa.js.svg - 98.1 MB --> -[![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png)](https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015) +![Interactive Data Structures](https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png) + ## Table of Contents @@ -96,7 +97,7 @@ The topics are divided in 4 main categories as you can see below: _(You can click on the ⯈ to expand the topics)_ -### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part1.adoc) +### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part01-algorithms-analysis.asc) -- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linked-list.adoc): each data node has a link to the next (and +- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/linked-list.asc): each data node has a link to the next (and previous). [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js) | - [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/linked-list.adoc#linked-list-complexity-vs-array-complexity) + [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/linked-list.asc#linked-list-complexity-vs-array-complexity) -- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/queue.adoc): data flows in a "first-in, first-out" (FIFO) manner. +- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/queue.asc): data flows in a "first-in, first-out" (FIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/queues/queue.js) | - [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/queue.adoc#queue-complexity) + [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/queue.asc#queue-complexity) -- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/stack.adoc): data flows in a "last-in, first-out" (LIFO) manner. +- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/stack.asc): data flows in a "last-in, first-out" (LIFO) manner. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/stacks/stack.js) | - [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/stack.adoc#stack-complexity) + [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/stack.asc#stack-complexity) --- @@ -224,7 +225,7 @@ they take different time to complete. --- -#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/linear-data-structures-outro.adoc) +#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/array-vs-list-vs-queue-vs-stack.asc) Use Arrays when… - You need to access data in random order fast (using an index). @@ -245,7 +246,7 @@ Use Linked Lists when: --- - #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part2.adoc) + #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part02-linear-data-structures.asc) Build any of these data structures from scratch: - [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/linked-lists/linked-list.js) @@ -257,7 +258,7 @@ Use Linked Lists when: -### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) +### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) @@ -270,13 +271,13 @@ Use Linked Lists when: --- -#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map.adoc) +#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/map.asc) Learn how to implement different types of Maps such as: -- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap.adoc) -- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-treemap.adoc) +- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/hashmap.asc) +- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/treemap.asc) -Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/map-hashmap-vs-treemap.adoc): +Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/time-complexity-graph-data-structures.asc): - `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. - `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. @@ -295,9 +296,9 @@ Also, [learn the difference between the different Maps implementations](https:// --- -#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part3.adoc) +#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) -##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/graph.adoc) +##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/graph.asc) Know all the graphs properties with many images and illustrations. @@ -308,9 +309,9 @@ Know all the graphs properties with many images and illustrations. parents, loops. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/graphs/graph.js) | - [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/graph.adoc#graph-complexity) + [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/graph.asc#graph-complexity) -#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree.adoc) +#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/tree-intro.asc) Learn all the different kinds of trees and its properties. @@ -321,29 +322,29 @@ Learn all the different kinds of trees and its properties. graph not a tree. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc) - **Binary Trees**: same as tree but only can have two children at most. [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree.adoc#binary-tree) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc#binary-tree) - **Binary Search Trees** (BST): same as binary tree, but the nodes value keep this order `left < parent < right`. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/binary-search-tree.js) | - [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-binary-search-tree.adoc#tree-complexity) + [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/binary-search-tree.asc#tree-complexity) - **AVL Trees**: Self-balanced BST to maximize look up time. [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/avl-tree.js) | - [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-avl.adoc) + [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/C-AVL-tree.asc) | - [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/tree-self-balancing-rotations.adoc) + [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/B-self-balancing-binary-search-trees.asc) - **Red-Black Trees**: Self-balanced BST more loose than AVL to @@ -361,12 +362,12 @@ Learn all the different kinds of trees and its properties. --- -#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-binary-search-tree.adoc) +#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/binary-search-tree.asc) - Learn how to add/remove/update values in a tree: ![inserting node in a tree](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image36.png) -- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/tree-self-balancing-rotations.adoc) +- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/B-self-balancing-binary-search-trees.asc) From unbalanced BST to balanced BST ``` @@ -383,7 +384,7 @@ From unbalanced BST to balanced BST -### ⚒ [Algorithms Techniques](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/part4.adoc) +### ⚒ [Algorithmic Toolbox](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) @@ -397,7 +398,7 @@ From unbalanced BST to balanced BST --- -#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) +#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) 1. Understand the problem 1. Build a simple example (no edge cases yet) @@ -407,7 +408,7 @@ From unbalanced BST to balanced BST 1. Write Code, yes, now you can code. 1. Test your written code -Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithmic-toolbox.adoc) +Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) --- @@ -419,34 +420,34 @@ Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and- --- -#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/sorting-intro.adoc) +#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/sorting-algorithms.asc) We are going to explore three basic sorting algorithms O(n2) which have low overhead: - Bubble Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/bubble-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/bubble-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/bubble-sort.asc) - Insertion Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/insertion-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/insertion-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/insertion-sort.asc) - Selection Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/selection-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/selection-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/selection-sort.asc) and then discuss efficient sorting algorithms O(n log n) such as: - Merge Sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/merge-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/merge-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/merge-sort.asc) - Quick sort. [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/quick-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/chapters/quick-sort.adoc) + [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/quick-sort.asc) --- @@ -458,13 +459,13 @@ and then discuss efficient sorting algorithms O(n log n) such as: --- -#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/algorithms-intro.adoc) +#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) We are going to discuss the following techniques for solving algorithms problems: -- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/greedy-algorithms.adoc): makes greedy choices using heuristics to find the best solution without looking back. -- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/dynamic-programming.adoc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. -- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/divide-and-conquer.adoc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. -- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/chapters/backtracking.adoc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. +- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/bbook/content/part04/greedy-algorithms.asc): makes greedy choices using heuristics to find the best solution without looking back. +- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. +- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. +- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). --- diff --git a/book/A-time-complexity-cheatsheet.asc b/book/A-time-complexity-cheatsheet.asc new file mode 100644 index 00000000..64400aaa --- /dev/null +++ b/book/A-time-complexity-cheatsheet.asc @@ -0,0 +1,39 @@ +[appendix] +[[a-time-complexity-cheatsheet]] +== Cheatsheet + +This section summerize what we are going to cover in the rest of this book. + +=== Runtimes + +include::content/part01/big-o-examples.asc[tag=table] + +include::content/part01/algorithms-analysis.asc[tag=table] + +=== Linear Data Structures + +include::content/part02/array-vs-list-vs-queue-vs-stack.asc[tag=table] + +=== Trees and Maps Data Structures + +This section covers Binary Search Tree (BST) time complexity (Big O). + +include::content/part03/time-complexity-graph-data-structures.asc[tag=table] + +include::content/part03/graph.asc[tag=table] + +=== Sorting Algorithms + +include::content/part04/sorting-algorithms.asc[tag=table] + +// // https://algs4.cs.princeton.edu/cheatsheet/ +// // http://bigocheatsheet.com/ + +// // https://en.wikipedia.org/wiki/Timsort (Tim Peters) +// // https://bugs.python.org/file4451/timsort.txt +// // https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m + +// // https://en.wikipedia.org/wiki/Sorting_algorithm +// // http://sorting.at/ +// // https://www.toptal.com/developers/sorting-algorithms +// // https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/chapters/tree-self-balancing-rotations.adoc b/book/B-self-balancing-binary-search-trees.asc similarity index 84% rename from book/chapters/tree-self-balancing-rotations.adoc rename to book/B-self-balancing-binary-search-trees.asc index 51b41f9d..249f510c 100644 --- a/book/chapters/tree-self-balancing-rotations.adoc +++ b/book/B-self-balancing-binary-search-trees.asc @@ -1,9 +1,6 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Self-balancing Binary Search Trees +[appendix] +[[b-self-balancing-binary-search-trees]] +== Self-balancing Binary Search Trees Binary Search Trees (BST) are an excellent data structure to find elements very fast _O(log n)_. However, when the BST branches have different branch sizes, then the performance suffers. @@ -31,12 +28,13 @@ As you might notice, we balanced the tree in the example by doing a rotation. To be more specific we rotated node `1` to the left to balance the tree. Let's examine all the possible rotation we can do to balance a tree. -== Tree Rotations +[[tree-rotations]] +=== Tree Rotations (((Tree Rotations))) We can do single rotations left and right and also we can do double rotations. Let's go one by one. -=== Single Right Rotation +==== Single Right Rotation Right rotation moves a node on the right as a child of another node. @@ -48,7 +46,7 @@ So, we move node 3 as the right child of the previous child. .Single right rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=rightRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=rightRotation] ---- .In the `rightRotation` we identify 3 nodes: @@ -64,7 +62,7 @@ Take a look at the implementation. .Swap Parent and Child Implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=swapParentChild] +include::../src/data-structures/trees/tree-rotations.js[tag=swapParentChild] ---- After `swapParentChild`, we have the following: @@ -93,14 +91,14 @@ Check out the <> implementation again. It This rotation is also known as `RR rotation`. -=== Single Left Rotation +==== Single Left Rotation Left rotation is similar to the `rightRotation` we explained above. .Single left rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=leftRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=leftRotation] ---- As you can see, this function is just the opposite of `rightRotation`. Where ever we used the right now we use the left here and vice versa. @@ -111,36 +109,37 @@ If you are curious about the `setRightAndUpdateParent` and `setLeftAndUpdatePare .Set and update parent implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/binary-tree-node.js[tag=setAndUpdateParent] +include::../src/data-structures/trees/binary-tree-node.js[tag=setAndUpdateParent] ---- You can also check out the full https://github.com/amejiarosario/dsa.js/blob/adfd8a660bbe0a7068fd7881aff9f51bdb9f92ae/src/data-structures/trees/binary-tree-node.js#L9[binary tree node implementation]. -=== Left Right Rotation +==== Left Right Rotation This time are we going to do a double rotation. .Left-Right rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=leftRightRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=leftRightRotation] ---- As you can see we do a left and then a right rotation. This rotation is also known as `LR rotation` -=== Right Left Rotation +==== Right Left Rotation Very similar to `leftRightRotation`. The difference is that we rotate right and then left. .Right-Left rotation implementation [source, javascript] ---- -include::{codedir}/data-structures/trees/tree-rotations.js[tag=rightLeftRotation] +include::../src/data-structures/trees/tree-rotations.js[tag=rightLeftRotation] ---- This rotation is also referred to as `RL rotation`. -== Self-balancing trees implementations +=== Self-balancing trees implementations So far, we have study how to make tree rotations which are the basis for self-balancing trees. There are different implementations of self-balancing trees such a Red-Black Tree and AVL Tree. + diff --git a/book/chapters/tree-avl.adoc b/book/C-AVL-tree.asc similarity index 77% rename from book/chapters/tree-avl.adoc rename to book/C-AVL-tree.asc index 8c4ed494..07bae068 100644 --- a/book/chapters/tree-avl.adoc +++ b/book/C-AVL-tree.asc @@ -1,9 +1,6 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= AVL Tree +[appendix] +[[c-avl-tree]] +== AVL Tree (((AVL Tree))) (((Tree, AVL))) AVL Tree is named after their inventors (**A**delson-**V**elsky and **L**andis). @@ -11,7 +8,7 @@ This self-balancing tree keeps track of subtree sizes to know if a rebalance is We can compare the size of the left and right subtrees using a balance factor. [NOTE] -==== +===== The *balanced factor* on each node is calculated recursively as follows: @@ -19,7 +16,7 @@ The *balanced factor* on each node is calculated recursively as follows: Balance Factor = (left subtree height) - (right subtree height) ---- -==== +===== The implementation will go in the BST node class. We will need two methods to calculate the left and right subtree, and with those, we can get the balance factor. @@ -27,18 +24,18 @@ We will need two methods to calculate the left and right subtree, and with those .Balance Factor methods on the BST node [source, javascript] ---- -include::{codedir}/data-structures/trees/binary-tree-node.js[tag=avl, indent=0] +include::../src/data-structures/trees/binary-tree-node.js[tag=avl, indent=0] ---- -== Implementing AVL Tree +=== Implementing AVL Tree Implementing an AVL Tree is not too hard since it builds upon what we did in the Binary Search Tree. .AVL Tree class [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=AvlTree] +include::../src/data-structures/trees/avl-tree.js[tag=AvlTree] ---- As you can see, the AVL tree inherits from the BST class. @@ -48,7 +45,7 @@ This function checks if the tree is symmetrical after every change to the tree. .Balance Upstream for AVL tree [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=balanceUpstream] +include::../src/data-structures/trees/avl-tree.js[tag=balanceUpstream] ---- This function recursively goes from the modified node to the root checking if each node in between is balanced. @@ -57,10 +54,10 @@ Now, let's examine how does the balancing works on AVL tree. .Balance method for AVL tree [source, javascript] ---- -include::{codedir}/data-structures/trees/avl-tree.js[tag=balance] +include::../src/data-structures/trees/avl-tree.js[tag=balance] ---- The first thing we do is to see if one subtree is longer than the other. If so, then we check the children balance to determine if need a single or double rotation and in which direction. -You can review <> in case you want a refresher. +You can review <> in case you want a refresher. diff --git a/book/book-all.adoc b/book/book-all.adoc deleted file mode 100644 index 5c872247..00000000 --- a/book/book-all.adoc +++ /dev/null @@ -1,155 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -ifndef::backend-epub3[:leveloffset: +1] -include::chapters/dedication.adoc[] -ifndef::backend-epub3[:leveloffset: -1] - -// TODO: pending -include::chapters/preface.adoc[] - -include::chapters/cheatsheet.adoc[] - -// add sections to chapters -:sectnums: - -// -// chapters -// - -= Algorithms Analysis - -// TODO: pending -include::chapters/algorithms-analysis-intro.adoc[] - -:leveloffset: +1 - -include::chapters/algorithms-analysis.adoc[] - -include::chapters/big-o-examples.adoc[] - -:leveloffset: -1 - -= Linear Data Structures - -include::chapters/linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -include::chapters/array.adoc[] - -include::chapters/linked-list.adoc[] - -include::chapters/stack.adoc[] - -include::chapters/queue.adoc[] - -:leveloffset: -1 - -= Non-Linear Data Structures - -include::chapters/non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -include::chapters/tree.adoc[] - -include::chapters/binary-search-tree.adoc[] - -include::chapters/map.adoc[] - -include::chapters/set.adoc[] - -include::chapters/graph.adoc[] - - -:leveloffset: -1 - -= Advanced Non-Linear Data Structures - -// TODO: pending -include::chapters/non-linear-data-structures-intro-advanced.adoc[] - -:leveloffset: +1 - -// TODO: pending -include::chapters/avl-tree.adoc[] - -// TODO: pending (optional) -// include::chapters/red-black-tree.adoc[] - -// TODO: pending -include::chapters/heap.adoc[] - -// TODO: (optional) pending -// include::chapters/trie.adoc[] - - -:leveloffset: -1 - -= Algorithms - -// TODO: pending -include::chapters/algorithms-intro.adoc[] - -:leveloffset: +1 - -// TODO: pending -include::chapters/sorting-intro.adoc[] - -// -// Slow Sorting -// - -include::chapters/insertion-sort.adoc[] - -include::chapters/selection-sort.adoc[] - -include::chapters/bubble-sort.adoc[] - -// -// Fast Sorting -// - -include::chapters/merge-sort.adoc[] - -include::chapters/quick-sort.adoc[] - -// TODO: (optional) pending -// include::chapters/heap-sort.adoc[] - -// TODO: (optional) pending -// include::chapters/tim-sort.adoc[] - -// -// Searching -// - -// TODO: pending -include::chapters/graph-search.adoc[] - -:leveloffset: -1 - -// -// end chapters -// - -include::chapters/epigraph.adoc[] - -// TODO: (optional) pending -// include::chapters/appendix.adoc[] - -// TODO: (optional) pending -ifdef::backend-pdf[] -include::chapters/index.adoc[] -endif::[] - diff --git a/book/book-o.adoc b/book/book-o.adoc deleted file mode 100644 index 6fc2744b..00000000 --- a/book/book-o.adoc +++ /dev/null @@ -1,194 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia (g) -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -ifndef::backend-epub3[:leveloffset: +1] -include::chapters/dedication.adoc[] -ifndef::backend-epub3[:leveloffset: -1] - -// (g) -include::chapters/preface.adoc[] - -// add sections to chapters -:sectnums: - - -//----------------------------------- -// TODO: commment out sample on final -//----------------------------------- - -include::chapters/sample.adoc[] - -//----------------------------------- -// TODO: end remove ------ -//----------------------------------- - -// -// chapters -// - -= Algorithms Analysis - -include::chapters/algorithms-analysis-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/algorithms-analysis.adoc[] - -// (g) -include::chapters/big-o-examples.adoc[] - -:leveloffset: -1 - -= Linear Data Structures - -// (g) -include::chapters/linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/array.adoc[] - -// (g) -include::chapters/linked-list.adoc[] - -// (g) -include::chapters/stack.adoc[] - -// (g) -include::chapters/queue.adoc[] - -// (g) -include::chapters/linear-data-structures-outro.adoc[] - -:leveloffset: -1 - - -= Non-Linear Data Structures - -// (g) -include::chapters/non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/tree.adoc[] - - -// (g) -include::chapters/tree-binary-search-tree.adoc[] - -include::chapters/tree-search.adoc[] - -include::chapters/tree-self-balancing-rotations.adoc[] - -:leveloffset: +1 - -include::chapters/tree-avl.adoc[] - -:leveloffset: -1 - -// (g) -// include::chapters/map.adoc[] -include::chapters/map-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::chapters/map-hashmap.adoc[] - -// (g) -include::chapters/map-treemap.adoc[] - -// (g) -include::chapters/map-hashmap-vs-treemap.adoc[] - -:leveloffset: -1 - -// (g) -include::chapters/set.adoc[] - -// (g) -include::chapters/graph.adoc[] - -// TODO: pending -include::chapters/graph-search.adoc[] - -:leveloffset: -1 - -= Algorithmic Techniques - -// TODO: pending -include::chapters/algorithms-intro.adoc[] - -:leveloffset: +1 - -// -// Sorting algorithms -// -= Sorting Algorithms - -:leveloffset: +1 - -// TODO: pending -include::chapters/sorting-intro.adoc[] - -// Slow Sorting - -include::chapters/insertion-sort.adoc[] - -include::chapters/selection-sort.adoc[] - -include::chapters/bubble-sort.adoc[] - -// Fast Sorting - -include::chapters/merge-sort.adoc[] - -include::chapters/quick-sort.adoc[] - -:leveloffset: -1 - - -// -// Algorithms Techniques -// - -include::chapters/divide-and-conquer.adoc[] - -include::chapters/dynamic-programming.adoc[] - -include::chapters/greedy-algorithms.adoc[] - -include::chapters/backtracking.adoc[] - -// --- end algorithms --- - -:leveloffset: -1 - -:sectnums!: - -= Appendix - -:leveloffset: +1 - -// TODO: review and complete when the rest is completed -include::chapters/cheatsheet.adoc[] - -:leveloffset: -1 - -// -// end chapters -// - -include::chapters/epigraph.adoc[] diff --git a/book/book.adoc b/book/book.adoc deleted file mode 100644 index 4e0ad075..00000000 --- a/book/book.adoc +++ /dev/null @@ -1,84 +0,0 @@ -= Data Structures and Algorithms in JavaScript -:book-title: {doctitle} -:author: Adrian Mejia -:email: hello+dsajs@adrianmejia.com -:revnumber: 1.0.0 -:revdate: {docdate} -:revyear: 2019 -:revremark: First Edition -:subject: Algorithms -:keywords: dsa.js, Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees -:doctype: book -:media: screen -ifeval::["{media}" != "prepress"] -:front-cover-image: image:cover-a4.png[Front Cover,595,842] -endif::[] -:toc: -:toclevels: 3 -:icons: font -:lang: en -:language: javascript -:experimental: -:pdf-fontsdir: ./fonts -:pdf-stylesdir: ./_resources/pdfstyles -:pdf-style: adrian-screen -:title-logo-image: image:logo.png[Logo,50,50] -// custom variables -:imagesdir: {docdir}/images -:codedir: ../../src -:datadir: {docdir}/data -// :source-highlighter: pygments -// paraiso-light, xcode, monokai -// :pygments-style: xcode -:stem: -:plantuml-config: {docdir}/_conf/umlconfig.txt -// :hide-uri-scheme: -// :chapter-label: Chapter -// :appendix-caption: Appendix -// :chapter-label: -// dark -// :pygments-style: monokai -// light theme with colorful code -// solarized-light, tomorrow -// :source-highlighter: highlightjs -// :highlightjs-theme: tomorrow - -ifndef::ebook-format[:leveloffset: 1] - -[colophon#colophon%nonfacing] -include::chapters/colophon.adoc[] - -[dedication] -include::chapters/dedication.adoc[] - -// [%nonfacing] -// include::chapters/acknowledgements.adoc[] - -[preface] -include::chapters/preface.adoc[] - -// include::chapters/introduction.adoc[] - -// TODO: (optional) include numbers but need to fix the part/chapter labels -// :sectnums: - -include::chapters/part1.adoc[] - -include::chapters/part2.adoc[] - -include::chapters/part3.adoc[] - -include::chapters/part4.adoc[] - -// :sectnums!: - -include::chapters/appendix.adoc[] - -// include::chapters/epigraph.adoc[] - -// include::chapters/about.adoc[] - -ifdef::backend-pdf,backend-docbook[] -[index] -= Index -endif::[] diff --git a/book/ch02-git-basics-chapter.asc b/book/ch02-git-basics-chapter.asc new file mode 100644 index 00000000..cb91537b --- /dev/null +++ b/book/ch02-git-basics-chapter.asc @@ -0,0 +1,35 @@ +[[ch02-git-basics-chapter]] +== Git Basics + +If you can read only one chapter to get going with Git, this is it. +This chapter covers every basic command you need to do the vast majority of the things you'll eventually spend your time doing with Git. +By the end of the chapter, you should be able to configure and initialize a repository, begin and stop tracking files, and stage and commit changes. +We'll also show you how to set up Git to ignore certain files and file patterns, how to undo mistakes quickly and easily, how to browse the history of your project and view changes between commits, and how to push and pull from remote repositories. + +[[links]] +=== Links + +.Links to DSA +- Chapter: <> +- Section: <> + +// In <> we used it to specify our name, email address and editor preference before we even got started using Git. + +[source,console] +---- +$ git commit +---- + +Doing so launches your editor of choice. +(This is set by your shell's `EDITOR` environment variable -- usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in + +// <>).(((editor, changing default)))(((git commands, config))) + + + + + +=== Summary + +At this point, you can do all the basic local Git operations -- creating or cloning a repository, making changes, staging and committing those changes, and viewing the history of all the changes the repository has been through. +Next, we'll cover Git's killer feature: its branching model. diff --git a/book/chapters/about.adoc b/book/chapters/about.adoc deleted file mode 100644 index 73d625c5..00000000 --- a/book/chapters/about.adoc +++ /dev/null @@ -1 +0,0 @@ -= About the author diff --git a/book/chapters/acknowledgements.adoc b/book/chapters/acknowledgements.adoc deleted file mode 100644 index 37ecc759..00000000 --- a/book/chapters/acknowledgements.adoc +++ /dev/null @@ -1 +0,0 @@ -= Acknowledgements diff --git a/book/chapters/action.adoc b/book/chapters/action.adoc deleted file mode 100644 index 1e88adb2..00000000 --- a/book/chapters/action.adoc +++ /dev/null @@ -1,4 +0,0 @@ -[[action]] -= Action! - -== Additional reading diff --git a/book/chapters/appendix.adoc b/book/chapters/appendix.adoc deleted file mode 100644 index 50074282..00000000 --- a/book/chapters/appendix.adoc +++ /dev/null @@ -1,3 +0,0 @@ -// Appendix A: -include::cheatsheet.adoc[] - diff --git a/book/chapters/avl-tree.adoc b/book/chapters/avl-tree.adoc deleted file mode 100644 index 569c30df..00000000 --- a/book/chapters/avl-tree.adoc +++ /dev/null @@ -1,5 +0,0 @@ -= AVL Tree - -The AVL tree builds on top of a <> and it keeps it balanced on insertions. It prevents a BST worst case scenario when the tree is totally unbalanced to one side (similar to linked list), then it takes O(n) to find an element instead of O(log n). - - diff --git a/book/chapters/cheatsheet.adoc b/book/chapters/cheatsheet.adoc deleted file mode 100644 index 06308b35..00000000 --- a/book/chapters/cheatsheet.adoc +++ /dev/null @@ -1,38 +0,0 @@ -[appendix] -= Time Complexity Cheatsheet - -This section summerize what we are going to cover in the rest of this book. - -== Runtimes - -include::big-o-examples.adoc[tag=table] - -include::algorithms-analysis.adoc[tag=table] - -== Linear Data Structures - -include::linear-data-structures-outro.adoc[tag=table] - -== Trees and Maps Data Structures - -This section covers Binary Search Tree (BST) time complexity (Big O). - -include::part3.adoc[tag=table] - -include::graph.adoc[tag=table] - -== Sorting Algorithms - -include::sorting-summary.adoc[tag=table] - -// https://algs4.cs.princeton.edu/cheatsheet/ -// http://bigocheatsheet.com/ - -// https://en.wikipedia.org/wiki/Timsort (Tim Peters) -// https://bugs.python.org/file4451/timsort.txt -// https://www.youtube.com/watch?v=emeME__917E&list=PLMCXHnjXnTntLcLmA5SqhMspm7burHi3m - -// https://en.wikipedia.org/wiki/Sorting_algorithm -// http://sorting.at/ -// https://www.toptal.com/developers/sorting-algorithms -// https://www.infopulse.com/blog/timsort-sorting-algorithm/ diff --git a/book/chapters/dedication.adoc b/book/chapters/dedication.adoc deleted file mode 100644 index e9c9590b..00000000 --- a/book/chapters/dedication.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[dedication] -= Dedication - -To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail. - diff --git a/book/chapters/divide-and-conquer-intro.adoc b/book/chapters/divide-and-conquer-intro.adoc deleted file mode 100644 index 5876599f..00000000 --- a/book/chapters/divide-and-conquer-intro.adoc +++ /dev/null @@ -1,17 +0,0 @@ -(((Divide and Conquer))) -(((Algorithmic Techniques, Divide and Conquer))) -Divide and conquer is a strategy for solving algorithmic problems. -It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. - -We have already implemented some algorithms using the divide and conquer technique. - -.Examples of divide and conquer algorithms: -- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. -- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. -- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. -- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. - -.In general, the divide and conquer algorithms have the following pattern: -1. *Divide* data into subproblems. -2. *Conquer* each subproblem. -3. *Combine* results. diff --git a/book/chapters/divide-and-conquer.adoc b/book/chapters/divide-and-conquer.adoc deleted file mode 100644 index b394687c..00000000 --- a/book/chapters/divide-and-conquer.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Divide and Conquer - -include::divide-and-conquer-intro.adoc[] - -:leveloffset: +1 - -include::divide-and-conquer-fibonacci.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/dynamic-programming-fibonacci.adoc b/book/chapters/dynamic-programming-fibonacci.adoc deleted file mode 100644 index 86e513ec..00000000 --- a/book/chapters/dynamic-programming-fibonacci.adoc +++ /dev/null @@ -1,35 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Fibonacci Sequence with Dynamic Programming -(((Fibonacci))) -Let's solve the same Fibonacci problem but this time with dynamic programming. - -When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. - -.Recursive Fibonacci Implemenation using Dynamic Programming -[source, javascript] ----- -include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] ----- - -This implementation checks if we already calculated the value, if so it will save it for later use. - -[graphviz, Recursive Fibonacci call tree with dp, svg] -.... -graph G { - "fib(5)" -- { "fib(4)" } - "fib(4)" -- { "fib(3)" } - "fib(3)" -- { "fib(2)" } - "fib(2)" -- { "fib(1)", "fib(0)" } -} -.... - -This graph looks pretty linear now. It's runtime _O(n)_! -(((Linear))) -(((Runtime, Linear))) - -(((Memoization))) -TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/chapters/dynamic-programming-intro.adoc b/book/chapters/dynamic-programming-intro.adoc deleted file mode 100644 index f40e9371..00000000 --- a/book/chapters/dynamic-programming-intro.adoc +++ /dev/null @@ -1,30 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -(((Dynamic Programming))) -(((Algorithmic Techniques, Dynamic Programming))) -Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. - -// https://twitter.com/amejiarosario/status/1103050924933726208 -// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson -// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 -// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem - -.How to explain dynamic programming to kids? 👶 -**** - -$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ - ---{sp} What's that equal to? - ---{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! - ---{sp} Add another "+1". What's the total now? - ---{sp} $$*$$*_Quickly_*$$*$$ Eleven! - ---{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." -**** - diff --git a/book/chapters/dynamic-programming-knapsack-problem.adoc b/book/chapters/dynamic-programming-knapsack-problem.adoc deleted file mode 100644 index b581632f..00000000 --- a/book/chapters/dynamic-programming-knapsack-problem.adoc +++ /dev/null @@ -1,52 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Knapsack Problem - -The knapsack (backpack [big]#🎒#) problem is the following: - -> A thief breaks into a museum with a backpack that can carry certain weight. -What items shoud he pick to maximize his loot? - -Take a look at the following example to understand better the problem. - -.Knapsack Problem Examples -[source, javascript] ----- - -// Input: -const museumGoods = [ - { value: 1, weight: 1}, - { value: 4, weight: 3 }, - { value: 5, weight: 4 }, - { value: 7, weight: 5 }, -] - -const maxBackpackWeight = 7; - -// Solution: -const backpack = solveKnapsackProblem(museumGoods, maxBackpackWeight); - -// Output: -expect(backpack.items).to.equal([ - { value: 4, weight: 3 }, - { value: 5, weight: 4 } -]) - -expect(backpack.weight).toBeLessThanOrEqual(7); -expect(backpack.value).toBe(9); ----- - -How can we solve this problem? You cannot take them all since total weight is 13 and we only can carry 7. You should not take only one, since that would not be the maximum loot and you would - -One idea would be sort the items by weight and take the items if they do not exceed the max weight. -In that case, the result would be: - ----- - { value: 7, weight: 5 }, - { value: 1, weight: 1}, ----- - -As you can see, this solution is not optimal. The value total value is `8` and the weight just `6`. diff --git a/book/chapters/dynamic-programming.adoc b/book/chapters/dynamic-programming.adoc deleted file mode 100644 index 269a4178..00000000 --- a/book/chapters/dynamic-programming.adoc +++ /dev/null @@ -1,16 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Dynamic Programming - -include::dynamic-programming-intro.adoc[] - -:leveloffset: +1 - -include::dynamic-programming-fibonacci.adoc[] - -// include::chapters/dynamic-programming-knapsack-problem.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/epigraph.adoc b/book/chapters/epigraph.adoc deleted file mode 100644 index a70dd6d3..00000000 --- a/book/chapters/epigraph.adoc +++ /dev/null @@ -1,4 +0,0 @@ -[epigraph] -= Epigraph - -Thanks for reading this book. Stay effective! diff --git a/book/chapters/greedy-algorithms-intro.adoc b/book/chapters/greedy-algorithms-intro.adoc deleted file mode 100644 index f97bb42a..00000000 --- a/book/chapters/greedy-algorithms-intro.adoc +++ /dev/null @@ -1,50 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -(((Greedy Algorithms))) -(((Algorithmic Techniques, Greedy Algorithms))) -Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. -They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. - -An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. - -[graphviz, Find the largest sum, svg] -.... -graph G { - 5 -- 3 [color="#B8E986", penwidth=2] - 5 -- 7 [color="#FF5252", penwidth=2] - 3 -- 87 [color="#B8E986", penwidth=2] - 3 -- 1 - 7 -- 2 - 7 -- 4 [color="#FF5252", penwidth=2] - - label="Optimal vs. Greedy path" -} -.... - -Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. - -Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. - -[TIP] -==== -Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. -This algorithm only gives one shot at finding the solution and never goes back to consider other options. -==== - -Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. - -.Some examples of greedy algorithms that works well: -- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. -- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. -indexterm:[Merge Sort] - - -.In general, we can follow these steps to design Greedy Algorithms: -1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). -2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. -3. Reduce the processed input and repeat step #1 and #2 until all data is gone. -4. Return solution. -5. Check correctness with different examples and edge cases. diff --git a/book/chapters/greedy-algorithms-knapsack-problem.adoc b/book/chapters/greedy-algorithms-knapsack-problem.adoc deleted file mode 100644 index 7993b180..00000000 --- a/book/chapters/greedy-algorithms-knapsack-problem.adoc +++ /dev/null @@ -1,57 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Fractional Knapsack Problem - -We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: - -> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? - -Let's say we have the following items available. - -.Knpasack Input -[source, javascript] ----- -const items = [ - { value: 1, weight: 1}, - { value: 4, weight: 3 }, - { value: 5, weight: 4 }, - { value: 7, weight: 5 }, -]; - -const maxWeight = 7; ----- - -So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. - -How would you solve this problem? - -First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: - -- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. - -- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# - -- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# - -.Items value/weight ratio ----- - { value: 1, weight: 1 }, // 1/1 = 1 - { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ - { value: 5, weight: 4 }, // 5/4 = 1.25 - { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ ----- - -Let's implement this algorithm! - -.Factional Knapsack Problem Implementation -[source, javascript] ----- -include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] ----- - -What's the runtime of this algorithm? - -We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/chapters/greedy-algorithms.adoc b/book/chapters/greedy-algorithms.adoc deleted file mode 100644 index 43685ec7..00000000 --- a/book/chapters/greedy-algorithms.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Greedy Algorithms - -include::greedy-algorithms-intro.adoc[] - -:leveloffset: +1 - -include::greedy-algorithms-knapsack-problem.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/heap-sort.adoc b/book/chapters/heap-sort.adoc deleted file mode 100644 index 421cab79..00000000 --- a/book/chapters/heap-sort.adoc +++ /dev/null @@ -1,7 +0,0 @@ -= Heap Sort - -Voluptate consequat magna laborum consectetur fugiat deserunt. Id sit est ullamco magna sint laborum proident. Exercitation cupidatat exercitation excepteur ex pariatur qui qui sint amet consectetur laborum ex mollit dolore. - -Et do sunt do labore culpa est eu ut fugiat eiusmod ea excepteur. Irure commodo adipisicing in aute aliquip laborum laboris reprehenderit incididunt in sunt. Cupidatat veniam est culpa ex eu aute voluptate tempor aliqua ullamco sunt et consectetur. Eu laboris mollit culpa consequat. Sunt mollit quis dolor nostrud. In duis mollit do adipisicing veniam do deserunt exercitation Lorem deserunt aliquip. Ea esse reprehenderit incididunt eu deserunt sit nulla sint non eiusmod nisi eu et irure. - -Ad commodo anim nulla occaecat non. Aute fugiat laborum ut mollit exercitation aute proident reprehenderit culpa consectetur. Cillum officia laborum proident labore sunt est eiusmod proident. Lorem nostrud ea qui tempor culpa ullamco ipsum. Dolore nulla minim qui incididunt qui sint consectetur quis tempor esse minim. Do id consequat commodo sit officia aliqua officia reprehenderit eiusmod elit do amet. diff --git a/book/chapters/heap.adoc b/book/chapters/heap.adoc deleted file mode 100644 index 104af153..00000000 --- a/book/chapters/heap.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Heap - -Sit nostrud Lorem nulla ipsum occaecat enim eiusmod adipisicing velit et cupidatat laboris incididunt. Sunt ex eiusmod amet nulla quis. Officia elit non sunt esse sint. Non enim do laborum adipisicing officia et aliquip cillum ut nisi ipsum. Minim duis minim velit amet laborum aliquip pariatur irure deserunt ex. diff --git a/book/chapters/index.adoc b/book/chapters/index.adoc deleted file mode 100644 index 85e81b85..00000000 --- a/book/chapters/index.adoc +++ /dev/null @@ -1,2 +0,0 @@ -[index] -= Index diff --git a/book/chapters/insertion-selection-bubble-sort.adoc b/book/chapters/insertion-selection-bubble-sort.adoc deleted file mode 100644 index 4b0ea8e2..00000000 --- a/book/chapters/insertion-selection-bubble-sort.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Insertion vs Selection vs Bubble Sort - -All these three algorithms diff --git a/book/chapters/map-intro.adoc b/book/chapters/map-intro.adoc deleted file mode 100644 index 9bbd3849..00000000 --- a/book/chapters/map-intro.adoc +++ /dev/null @@ -1,26 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Map -(((Map))) -(((Data Structures, Non-Linear, Map))) -A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. - -IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. - -Many languages have maps already built-in. JavaScript/Node has `Map`: - -.JavaScript Built-in Map Usage -[source, javascript] ----- -include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] ----- - -In short, you set `key`/`value` pair and then you can get the `value` using the `key`. - -The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: - -* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. -* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. diff --git a/book/chapters/map.adoc b/book/chapters/map.adoc deleted file mode 100644 index 63307e68..00000000 --- a/book/chapters/map.adoc +++ /dev/null @@ -1,18 +0,0 @@ -<<< -include::map-intro.adoc[] - -:leveloffset: +1 - -// (g) -<<< -include::map-hashmap.adoc[] - -// (g) -<<< -include::map-treemap.adoc[] - -// (g) -<<< -include::map-hashmap-vs-treemap.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/non-linear-data-structures-intro.adoc b/book/chapters/non-linear-data-structures-intro.adoc deleted file mode 100644 index 0a1455e1..00000000 --- a/book/chapters/non-linear-data-structures-intro.adoc +++ /dev/null @@ -1,12 +0,0 @@ -[partintro] --- -Non-Linear data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. - -.In this chapter we are going to learn: -- Exciting <> data structure applications -- Searching efficiently with a <> data structures. -- One of the most versatile data structure of all <>. -- Keeping dups out with a <>. - -By the end of this section, you will know the data structures trade-offs and when to use one over the other. --- diff --git a/book/chapters/part1.adoc b/book/chapters/part1.adoc deleted file mode 100644 index 1b262f58..00000000 --- a/book/chapters/part1.adoc +++ /dev/null @@ -1,20 +0,0 @@ -[[chapter-1]] -= Algorithms Analysis - -[partintro] --- -In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. --- - - -:leveloffset: +1 - -// (g) -include::algorithms-analysis.adoc[] - -// (g) -include::big-o-examples.adoc[] - -:leveloffset: -1 - - diff --git a/book/chapters/part2.adoc b/book/chapters/part2.adoc deleted file mode 100644 index 7bc821d0..00000000 --- a/book/chapters/part2.adoc +++ /dev/null @@ -1,29 +0,0 @@ -[[chapter-2]] -= Linear Data Structures - -// (g) -include::linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::array.adoc[] - -// (g) -<<< -include::linked-list.adoc[] - -// (g) -<<< -include::stack.adoc[] - -// (g) -<<< -include::queue.adoc[] - -// (g) -<<< -include::linear-data-structures-outro.adoc[] - -:leveloffset: -1 - diff --git a/book/chapters/part3.adoc b/book/chapters/part3.adoc deleted file mode 100644 index f64d9d2f..00000000 --- a/book/chapters/part3.adoc +++ /dev/null @@ -1,63 +0,0 @@ -[[chapter-3]] -= Non-Linear Data Structures - -// (g) -include::non-linear-data-structures-intro.adoc[] - -:leveloffset: +1 - -// (g) -include::tree.adoc[] - - -// (g) -<<< -include::tree-binary-search-tree.adoc[] - -<<< -include::tree-search.adoc[] - -<<< -include::tree-self-balancing-rotations.adoc[] - -:leveloffset: +1 - -<<< -include::tree-avl.adoc[] - -:leveloffset: -1 - -// (g) -include::map.adoc[] - -// (g) -include::set.adoc[] - -// (g) -include::graph.adoc[] - -include::graph-search.adoc[] - -// Graph summary -= Summary - -In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. -(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) - -// tag::table[] -.Time and Space Complexity for Non-Linear Data Structures -|=== -.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity -^|_Index/Key_ ^|_Value_ -| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) -| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) -|=== -{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. -// end::table[] - -:leveloffset: -1 diff --git a/book/chapters/part4.adoc b/book/chapters/part4.adoc deleted file mode 100644 index 2494091a..00000000 --- a/book/chapters/part4.adoc +++ /dev/null @@ -1,62 +0,0 @@ -[[chapter-4]] -= Algorithmic Techniques - -// TODO: pending -include::algorithms-intro.adoc[] - -:leveloffset: +1 - -include::sorting-intro.adoc[] - -:leveloffset: +1 - -include::sorting-properties.adoc[] - - -// Slow Sorting -<<< -include::bubble-sort.adoc[] - -<<< -include::insertion-sort.adoc[] - -<<< -include::selection-sort.adoc[] - - -// include::insertion-selection-bubble-sort.adoc[] - -// Fast Sorting -<<< -include::merge-sort.adoc[] - -<<< -include::quick-sort.adoc[] - -<<< -include::sorting-summary.adoc[] - -:leveloffset: -1 - - -// -// Algorithms Techniques -// -<<< -include::divide-and-conquer.adoc[] - -<<< -include::dynamic-programming.adoc[] - -<<< -include::greedy-algorithms.adoc[] - -<<< -include::backtracking.adoc[] - -<<< -include::algorithmic-toolbox.adoc[] - -// --- end algorithms --- - -:leveloffset: -1 diff --git a/book/chapters/red-black-tree.adoc b/book/chapters/red-black-tree.adoc deleted file mode 100644 index 40c414b2..00000000 --- a/book/chapters/red-black-tree.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Red-Black Tree - -Nisi ex aliqua minim commodo cupidatat proident sint fugiat commodo irure. Duis quis ullamco ut veniam pariatur cillum voluptate irure. Irure aliqua elit cupidatat exercitation eiusmod et duis mollit proident reprehenderit ad. Aute aliquip cillum nostrud irure quis. Sint reprehenderit voluptate adipisicing amet ut aliquip. Eiusmod laborum nisi eu irure est consectetur ut ex sit cupidatat non. diff --git a/book/chapters/sample.adoc b/book/chapters/sample.adoc deleted file mode 100644 index 142de0af..00000000 --- a/book/chapters/sample.adoc +++ /dev/null @@ -1,359 +0,0 @@ -[[chapter-3]] -= Sample Section - - -:leveloffset: +1 - -// ------------------ - - -= Sample Title 1 - -((Provident)) architecto soluta `commodi` odit accusamus non molestias necessitatibus, culpa possimus repudiandae, ex sit officiis, sint hic doloribus harum vero quisquam aspernatur. - -Voluptate minim `laborum` velit irure labore commodo officia cillum qui. Id excepteur aliqua eiusmod voluptate dolor laboris. Ex laboris deserunt laboris consectetur adipisicing mollit consequat reprehenderit amet eiusmod. Anim magna ut culpa aliquip ea commodo proident exercitation duis nulla. Nulla sunt officia aliquip est sit incididunt sint ad fugiat. Qui fugiat elit magna id duis culpa aute. Officia magna et id esse qui nisi sint eu nostrud ex exercitation anim sunt magna. - -Ullamco eu veniam nisi `aliqua`. Lorem nulla nostrud Lorem quis ex. Minim magna irure ex et. Cillum est incididunt consequat deserunt do enim adipisicing elit esse nostrud nisi exercitation. Excepteur fugiat et veniam sit. Ipsum in sit qui exercitation ut in Lorem in esse excepteur aliqua voluptate proident duis. - -== Sample Title 2 - -Optio ab voluptate impedit, iusto explicabo tempore? Ipsam eaque accusamus mollitia accusantium quod aperiam. Sit cum tempora quod! Placeat assumenda adipisci eius? - -Minim pariatur in aute nulla non ea commodo velit enim ad nostrud culpa. Occaecat laborum aute nostrud excepteur aliquip eiusmod irure est nisi ut. Deserunt mollit qui pariatur irure voluptate labore adipisicing. Lorem exercitation pariatur cupidatat minim do sit ea cillum. Esse duis cillum veniam Lorem cillum do nulla. Sint esse ((dolor)) veniam dolor non cillum id voluptate. Nulla irure incididunt cillum in incididunt dolore sit amet pariatur. - -[#random-ref] -Sint nisi do deserunt elit. Laboris qui eiusmod ut et dolore laboris dolore tempor consectetur aliqua aliqua quis culpa. Duis deserunt ea reprehenderit duis commodo consequat et ea tempor culpa laborum anim. Tempor pariatur aute labore consectetur. Ut laboris amet aliquip in fugiat laborum ex. - -Occaecat eu ex incididunt proident consectetur proident eiusmod fugiat veniam dolor voluptate adipisicing. Eiusmod ullamco pariatur adipisicing fugiat ipsum cillum ullamco. Reprehenderit eu do tempor et amet. Ex ea sint non nisi enim tempor consequat labore. - -=== Sample Title 3 - -Quisquam, vero facere voluptatem impedit optio fuga accusamus non dignissimos, exercitationem culpa error debitis, molestiae corporis? Repudiandae eum dolor quae nemo reiciendis. - -Labore consequat deserunt ea sint incididunt duis laborum sit et ex adipisicing tempor. Labore nulla fugiat officia est irure nisi. Amet sint excepteur quis deserunt commodo mollit amet aute est qui aute laboris cillum. Tempor magna dolore velit reprehenderit dolore. Excepteur fugiat ullamco tempor ea labore magna ea in deserunt nulla. Consectetur eiusmod ea sit sint nulla officia consectetur. Elit proident qui voluptate nulla occaecat consectetur ex ullamco. - -Velit Lorem deserunt pariatur ex tempor. Exercitation incididunt nostrud elit pariatur incididunt labore dolor in incididunt nisi. Aliquip est nulla esse id aliqua mollit sit sunt tempor et excepteur. Adipisicing sunt tempor non consectetur reprehenderit excepteur sint laboris. - -==== Sample Title 4 - -Sint reprehenderit sit veniam eu adipisicing nisi. Fugiat tempor cillum pariatur Lorem eu cupidatat. Reprehenderit proident deserunt ipsum cupidatat fugiat enim proident officia. Consequat ad laboris aute qui labore ullamco nisi proident occaecat cupidatat eiusmod. Ullamco irure eiusmod velit aliqua enim anim est incididunt irure laborum ex non enim. Do exercitation nostrud duis sint minim nulla dolor veniam. - -Exercitation cupidatat ipsum velit consequat exercitation Lorem et anim labore minim cupidatat duis commodo. Deserunt amet aliquip sunt laborum officia. Reprehenderit id excepteur consectetur tempor eiusmod eu. Lorem pariatur ut ipsum irure Lorem irure nulla fugiat in ad officia. Sunt esse in sit aliquip. - -Laboris commodo labore anim ea. Nostrud culpa Lorem enim labore esse qui enim incididunt sunt eiusmod cupidatat veniam enim irure. Culpa velit duis duis esse amet adipisicing fugiat dolore do minim exercitation. Nostrud magna id nostrud nostrud minim cupidatat. Sunt amet qui amet deserunt commodo Lorem. - -===== Sample title 5 - -Irure nisi laboris amet do sit Lorem do. Aliqua esse ex in dolore nulla. Aute deserunt nostrud eiusmod fugiat aliquip proident ad eiusmod incididunt est in nisi deserunt Lorem. - -====== Sample title 6 - -Et nisi fugiat in culpa id voluptate incididunt anim commodo. Irure non dolor velit irure non incididunt nisi laborum minim. Elit duis consectetur aliqua laborum tempor et nulla. Nulla dolore magna dolor occaecat velit magna sint nulla. Proident veniam officia in nisi cillum ut deserunt consequat mollit laborum. - -<> - -======= Sample title 7 - -Ullamco ipsum consequat consequat in pariatur ad tempor nisi minim deserunt sunt ex. Minim enim irure quis aliqua anim nisi amet aliquip labore excepteur nisi amet commodo mollit. Est dolor eu commodo Lorem cillum. Elit deserunt cillum excepteur proident aliquip sunt incididunt. Deserunt voluptate enim incididunt incididunt pariatur. - - -== Code - -.Subsets in a Set -[source, javascript] ----- -include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] ----- -<1> Base case is empty element. -<2> For each element from the input append it to the results array. -<3> The new results array will be what it was before + the duplicated with the appended element. - -//.The way this algorithm generates all subsets is: -//1. The base case is an empty element (line 13). E.g. [''] -//2. For each element from the input append it to the results array (line 16) -//3. The new results array will be what it was before + the duplicated with the appended element (line 17) - -== Side notes - -.JavaScript built-in `BigInt` -**** -BigInt allows to operate beyond the maximum safe limit of integers (Number.MAX_SAFE_INTEGER => 9,007,199,254,740,991). BigInt uses the suffix n, e.g. 1n + 3n === 4n. -**** - -== ((Emojis)) - -Money flying: -[big]#💸# - -Clockwatch: -[big]*⏱* - -Honey and Bee: -[big]*🍯🐝* - -Skull: -[big]#💀# - -Scream: -[big]#😱# - -Sunglasses and thumbs up -[big]#😎👍# - -Turtle -[big]#🐢# - -Rocket: -[big]#🚀# - -Mindblown: -[big]*🤯* - -THumbsdown -[big]#👎# - -- Space Complexity: [big]#⚠️# <> _O(n)_ -- <>: [big]#✅# Yes -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ - -.How to explain dynamic programming to kids? 👶 ----- -Lorem ipsum dolor sit amet consectetur adipisicing elit. Dignissimos commodi qui maxime fugiat at eveniet blanditiis adipisci ex autem, numquam quidem iusto! Ex illum cupiditate ratione vero, molestiae beatae laboriosam? test [big]*🤯* ----- - -== Images - -.CPU operations vs. Algorithm runtime as the input size grows -image:image5.png[CPU time needed vs. Algorithm runtime as the input size increases] - -== Quotes - -Lorem, ipsum ((dolor)) sit amet consectetur adipisicing elit. Perspiciatis doloremque fuga nobis tempora saepe sed iste quod quia blanditiis dolorem alias, accusantium quas nihil ullam assumenda nostrum similique ad itaque? - -[quote, H. J. Harrington] -Measurement is the first step that leads to control and eventually to improvement. If you can’t measure something, you can’t understand it. If you can’t understand it, you can’t control it. If you can’t manage it, you can’t improve it. - -== Tables - -.Time and Space Complexity of Linear Data Structures (Array, LinkedList, Stack & Queues) -|=== -.2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space Complexity -^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) -| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) -| Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) -|=== -{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. - -.Time complexity for a Graph data structure -|=== -.2+.^s| Data Structure 2+^s| Vertices 2+^s| Edges .2+^.^s| Space Complexity -^|_Add_ ^|_Remove_ ^|_Add_ ^|_Remove_ -| Graph (adj. matrix) ^| O(\|V\|^2^) ^| O(\|V\|^2^) ^|O(1) ^|O(1) ^|O(\|V\|^2^) -| Graph (adj. list w/array) ^| O(1) ^| O(\|V\| + \|E\|)) ^|O(1) ^|O(\|V\| + \|E\|) ^|O(\|V\| + \|E\|) -| Graph (adj. list w/HashSet) ^| O(1) ^| O(\|V\|)) ^|O(1) ^|O(\|V\|) ^|O(\|V\| + \|E\|) -|=== - - -.Most common algorithmic running times and their examples -[cols="2,2,5",options="header"] -|=== -|Big O Notation -|Name -|Example(s) - -|O(1) -|<> -|#<>, #<> - -|O(log n) -|<> -|<> - -|O(n) -|<> -|<> - -|O(n log n) -|<> -|<> - -|O(n^2^) -|<> -|<> - -|O(n^3^) -|<> -|<> - -|O(2^n^) -|<> -|<> - -|O(n!) -|<> -|<> -|=== - -== Admonitions - -The following admonitions are used to highlight content - -IMPORTANT: Reword essential concepts. Good for memorizing, tweeting and sharing. - -.Side Note with Title -[NOTE] -==== -Side notes. E.g. provide language specific: BigInt, charCodeAt... -[source,javascript] ----- -function a(test) { - return `${test}`; -} ----- -==== - -=== Legend - -==== Note - -NOTE: Lorem ipsum ((dolor)) sit amet, consectetur adipisicing elit. Odio laudantium et consequuntur, eveniet numquam voluptatibus molestias nostrum reprehenderit blanditiis enim asperiores consequatur dolore tempore laboriosam! At aliquam mollitia aspernatur magnam. - -==== Tip - -TIP: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id nesciunt quaerat sint provident beatae. Assumenda necessitatibus ea non illum ipsa eveniet! Odio, blanditiis debitis harum porro autem ut fugiat deserunt. - -==== Important - -IMPORTANT: Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi maiores aperiam quasi error facilis ducimus quis vero architecto soluta! Fuga alias aspernatur voluptate voluptas veniam maxime eligendi nemo neque excepturi. - - -==== Caution - -CAUTION: Lorem ipsum dolor sit amet consectetur adipisicing elit. Sed deserunt error alias quod, modi ex, repudiandae voluptatem atque saepe, vero eius vel numquam aperiam neque incidunt eum nobis earum nostrum. - -==== Warning - -WARNING: Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque quam delectus consequatur omnis nostrum, minus consectetur animi quod adipisci, architecto similique quasi voluptatem voluptas repudiandae minima. Fuga incidunt maiores magnam! - -== HTML-only content (iframe) - -Later, in the 2nd part we are going to explore non-linear data structures like Graphs and Trees. -ifdef::backend-html5[] -If you want to have a general overview of each one, take a look at the following interactive diagram: -+++ - -+++ -endif::[] - - -== Graphviz Diagrams - -=== Graphviz with png - -[graphviz, dfs-graph, png] -.... -digraph G { - - node [fillcolor="#F8E71C" style=filled shape=circle] 0; - node [fillcolor="#F5A623"] 1; - node [fillcolor="#B8E986"] 2; - node [fillcolor="#BD10E0"] 3; - node [fillcolor="#50E3C2"] 4; - node [fillcolor="#4A90E2"] 5; - // node [fillcolor="#FF5252"] 6; - - 0 -> 5 - 0 -> 4 - 0 -> 1 - 1 -> 4 - 1 -> 3 - 2 -> 1 - 3 -> 4 - 3 -> 2 - - label="DFS" - - { rank=same; 3, 1 } - { rank=same; 0, 4 } - -} -.... - -=== Graphviz with svg -indexterm:[Fibonacci] - -[graphviz, Recursive Fibonacci call tree with dp (sample), svg] -.... -graph G { - "fib(5)" -- { "fib(4)" } - "fib(4)" -- { "fib(3)" } - "fib(3)" -- { "fib(2)" } - "fib(2)" -- { "fib(1)", "fib(0)" } -} -.... - -[graphviz, Words permutations (sample), svg] -.... -digraph g { - node [shape = record,height=.1]; - - art[label = " A| R| T"]; - art1[label = " A| R| T"]; - art2[label = " A| R| T", color="red"]; - atr[label = " A| T| R", color="red"]; - rat[label = " R| A| T"]; - rat1[label = " R| A| T", color="red"]; - rta[label = " R| T| A", color="red"]; - tra[label = " T| R| A"]; - tra1[label = " T| R| A", color="red"]; - tar[label = " T| A| R", color="red"]; - - "art":f0 -> "art1":f0 [ label = "1. swap A/A"]; - "art1":f0 -> "art2":f0 [ label = "2. swap R/R"]; - "art2":f2 -> "art1":f1 [ label = "3", color="grey"]; - "art1":f2 -> "atr":f0 [ label = "4. swap R/T"]; - "atr":f2 -> "art1":f2 [ label = "5", color="grey"]; - "art1":f1 -> "art":f0 [ label = "6", color="grey"]; - - "art":f1 -> "rat":f0 [ label = "7. swap A/R"]; - "rat":f0 -> "rat1":f0 [ label = "8. swap A/A"]; - "rat1":f2 -> "rat":f1 [ label = "9", color="grey"]; - "rat":f2 -> "rta":f0 [ label = "10. swap A/T"]; - - "art":f2 -> "tra":f0 [ label = "swap A/T"]; - "tra":f0 -> "tra1":f0 [ label = "swap R/R"]; - "tra":f2 -> "tar":f0 [ label = "swap R/A"]; - -} -.... - - - -// ------------------ - -:leveloffset: -1 - - -[[chapter-2]] -= Section 2 - -== Another sample - -[.lead] -Id excepteur sit duis ut ad nulla commodo elit consectetur est enim. Consectetur duis fugiat eu aute id cupidatat ullamco. Ad duis non consectetur aliqua nulla nostrud. - -Quis aute et consectetur ad pariatur ea commodo amet cupidatat velit ullamco. Cupidatat enim enim non est reprehenderit exercitation ut excepteur amet consectetur. Mollit quis ipsum eu adipisicing ipsum magna. - -Cupidatat sit aute et minim do. Non est anim fugiat proident ex enim voluptate non et consectetur. Culpa proident deserunt ipsum irure reprehenderit voluptate irure tempor tempor proident. Quis ipsum eiusmod tempor et reprehenderit non adipisicing. Consectetur dolore ullamco adipisicing ad adipisicing aliqua eu. Eu excepteur ipsum magna aliqua cillum in sint sint id exercitation est. Enim occaecat ut aute elit. - -Eiusmod excepteur eiusmod ((dolor)) magna nulla pariatur exercitation ex. Laborum sunt quis dolor qui do magna. Non velit reprehenderit minim duis est dolor commodo irure fugiat. Velit culpa laboris mollit esse minim sit id incididunt minim duis excepteur eiusmod ullamco. Pariatur pariatur ut laboris aute velit id nulla reprehenderit. - -Officia sint sit Lorem eu officia sint ad et et do. Deserunt nulla exercitation aute nulla enim laboris aliquip nulla. Commodo laboris amet enim veniam cupidatat culpa culpa duis deserunt esse ipsum. Deserunt nisi qui ullamco deserunt pariatur nisi velit tempor fugiat et pariatur do deserunt cillum. Dolore officia occaecat eiusmod occaecat reprehenderit cillum laboris irure irure ad tempor fugiat amet Lorem. Qui dolor elit ipsum consectetur commodo amet mollit eiusmod ex officia. Sit enim sunt nisi consectetur sint est id. - -Eu sint labore esse labore amet magna commodo exercitation labore. Esse aliquip dolor consequat exercitation ut amet labore esse velit. Et veniam ullamco aute laboris nulla exercitation qui aliqua eu. Ea cupidatat cupidatat non quis irure amet in minim laboris mollit. Enim eu pariatur et magna voluptate. diff --git a/book/chapters/sorting-intro.adoc b/book/chapters/sorting-intro.adoc deleted file mode 100644 index eaa4a9ef..00000000 --- a/book/chapters/sorting-intro.adoc +++ /dev/null @@ -1,20 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Sorting Algorithms - -Sorting is one of the most common solutions when we want to extract some insights about a collection of data. -We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. - -.We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: -- <> -- <> -- <> - -.and then discuss efficient sorting algorithms _O(n log n)_ such as: -- <> -- <> - -Before we dive into the most well-known sorting algorithms, let's discuss the sorting properties. diff --git a/book/chapters/sorting-properties.adoc b/book/chapters/sorting-properties.adoc deleted file mode 100644 index 7b1209e6..00000000 --- a/book/chapters/sorting-properties.adoc +++ /dev/null @@ -1,78 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Sorting Properties - -Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. - -Sorting properties are stable, adaptive, online and in-place. Let's go one by one. - -== Stable -(((Sorting, stable))) -An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. - -This especially useful when you want to sort on multiple phases. - -.Let's say you have the following data: -[source, javascript] ----- -const users = [ - { name: 'Bob', age: 32 }, - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Charly', age: 32 }, -]; ----- - -.If you sort by `name` you would have: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, - { name: 'Don', age: 30 }, -]; ----- - -Then, here comes the _critical_ part, if you sort by `age` you might get (at least two) different results. - -.If the sorting algorithm is *stable*; it should keep the items with the same age ordered by `name`: -[source, javascript] ----- -[ - { name: 'Alice', age: 30 }, - { name: 'Don', age: 30 }, - { name: 'Bob', age: 32 }, - { name: 'Charly', age: 32 }, -]; ----- - -.However, if the sorting is *not stable*, then you will lose the relative order of the items and get something like this: -[source, javascript] ----- -[ - { name: 'Don', age: 30 }, - { name: 'Alice', age: 30 }, - { name: 'Charly', age: 32 }, - { name: 'Bob', age: 32 }, -]; ----- - -Both results are sorted by `age`; however, having a stable sorting is better if you want to keep the relative position of data with the same value. - -== In-place -(((Sorting, in-place))) -An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. -No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. - -== Online -(((Sorting, online))) -It can sort a list as it receives it. -((Online sorting)) algorithms don't have to re-sort the whole collection for every new item added. - -== Adaptive -(((Sorting, adaptive))) -Algorithms with ((adaptive sorting)) run faster, close to _O(n)_, on an already sorted (or partially sorted) collection. diff --git a/book/chapters/sorting-summary.adoc b/book/chapters/sorting-summary.adoc deleted file mode 100644 index 5c0414e3..00000000 --- a/book/chapters/sorting-summary.adoc +++ /dev/null @@ -1,35 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Summary - -We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. -(((Tables, Algorithms, Sorting Complexities))) -(((Tables, Algorithms, Sorting Summary))) - -// tag::table[] -.Sorting algorithms comparison -[cols="20,80"] -|=== -| Algorithms | Comments -| <> | Swap pairs bubbling up largest numbers to the right -| <> | Look for biggest number to the left and swap it with current -| <> | Iterate array looking for smallest value to the right -| <> | Split numbers in pairs, sort pairs and join them in ascending order -| <> | Choose a pivot, set smaller values to the left and bigger to the right. -// | Tim sort | Hybrid of merge sort and insertion sort -|=== - -.Sorting algorithms time/space complexity and properties -|=== -| Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes -| <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No -| <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No -| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No -// | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes -|=== -// end::table[] diff --git a/book/chapters/timsort.adoc b/book/chapters/timsort.adoc deleted file mode 100644 index f2c5c29f..00000000 --- a/book/chapters/timsort.adoc +++ /dev/null @@ -1,63 +0,0 @@ -ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src -endif::[] - -= Tim Sort - -tim sort is an efficient recursive sorting algorithm that uses "divide and conquer" paradigm to sort faster. It can be implemented in-place so it doesn't require additonal memory. -indexterm:[Divide and Conquer] - -In practice timsort outperforms efficient sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. - -tim sort basically picks a "pivot" element (preferably random) and move all the elements that are smaller than the pivot to the right and the ones that are bigger to the left. It does this recursively until all the array is sorted. - -== tim Sort Implementation - -tim sort implementation uses the divide-and-conquer in the following way: - -.tim Sort Algorithm -. Pick a "pivot" element (at random) -. Move everything that is lower than the pivot to the left and everything that is bigger than the pivot to the right. -. Recursively repeat step 1 and 2, the sub-arrays on the left and on the right WITHOUT including the pivot. - -Let's convert these words into code! - -.tim Sort implementation in JavaScript (timSort) -[source, javascript] ----- -include::{codedir}/algorithms/sorting/tim-sort.js[tag=timSort, indent=0] ----- -<1> Partition: picks a pivot and find the index where the pivot will be when the array is sorted. -<2> Do the partition of the sub-array at the left of the pivot. -<3> Do the partition of the sub-array at the right of the pivot. -<4> Only do the partition when there's something to divide. - -The real heavy-lifting is don in the partion function. Let's implement that: - -.tim Sort implementation in JavaScript (partition) -[source, javascript] ----- -include::{codedir}/algorithms/sorting/tim-sort.js[tag=partition, indent=0] ----- -<1> Make the rightmost element as the pivot. -<2> This is the place holder for the final pivot index. We start in low and as we move all the lower elements to the left we will get the final place where the pivot should be. -<3> Move one element at a time comparing it to the pivot value. -<4> If the current element value is less than the pivot, then increment pivot index (pivot should be place after all the lower values). We also swap the value before incrementing because current element that is lower than the pivot to be at its left side. - -Merge sort has a _O(n log n)_ running time. For more details about the how to extract the runtime go to <>. - -== tim Sort Properties - -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#⚠️# <> _O(n)_ -- <>: [big]#✅# Yes -- <>: [big]#✅# Yes -- <>: [big]#️️️️️️️⛔️️️️️# No, mostly sorted array takes the same time O(n log n). -- <>: [big]#️️️️️️️⛔️️️️️# No, the pivot element can be choose at random. -- Recursive: Yes - - -// Resources: -// https://twitter.com/mathias/status/1036626116654637057?lang=en -// http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/src/share/classes/java/util/TimSort.java diff --git a/book/chapters/trie.adoc b/book/chapters/trie.adoc deleted file mode 100644 index 6c310e76..00000000 --- a/book/chapters/trie.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= Trie - -Aute ad cupidatat cillum enim deserunt. Reprehenderit eiusmod non do eiusmod duis culpa ipsum consequat tempor magna elit. Fugiat est eu proident incididunt adipisicing. Enim tempor aute ad quis officia enim enim pariatur do commodo labore sunt minim. diff --git a/book/config b/book/config index ca372d2e..32d0d63b 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit ca372d2e9e00db369453488216c2dd2c081865d3 +Subproject commit 32d0d63bf236990c3201c3e53ca357718ba6b9a8 diff --git a/book/chapters/colophon.adoc b/book/content/colophon.asc similarity index 87% rename from book/chapters/colophon.adoc rename to book/content/colophon.asc index 5be4908a..c6860171 100644 --- a/book/chapters/colophon.adoc +++ b/book/content/colophon.asc @@ -1,5 +1,5 @@ [colophon#colophon%nonfacing] -= {doctitle} +== Data Structures & Algorithms in JavaScript Copyright © {docyear} Adrian Mejia @@ -11,4 +11,5 @@ No part of this publication may be produced, store in a retrieval system, or tra While every precaution has been taking in the preparation of this book, the publisher and author assume no responsibility for errors or omissions, or damages resulting from the use of the information contained herein. -{revremark}, {revdate}. +// {revremark}, {revdate}. +Version {revnumber}, {revdate}. diff --git a/book/content/cover.png b/book/content/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..f0194209615492ce20c67d80ec6a4b371b195758 GIT binary patch literal 114081 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 CDZHfs literal 0 HcmV?d00001 diff --git a/book/content/dedication.asc b/book/content/dedication.asc new file mode 100644 index 00000000..2d833fbf --- /dev/null +++ b/book/content/dedication.asc @@ -0,0 +1,4 @@ +[dedication] +== Dedication + +_To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail._ diff --git a/book/content/introduction.asc b/book/content/introduction.asc new file mode 100644 index 00000000..cec2cb11 --- /dev/null +++ b/book/content/introduction.asc @@ -0,0 +1,59 @@ +[preface] +== Introduction + +You are about to become a better programmer and grasp the fundamentals of Algorithms and Data Structures. +Let's take a moment to explain how are we going to do that. + +This book is divided in 4 main parts.... + +In *Chapter 1*, we're going to cover Version Control Systems (VCSs) and Git basics -- no technical stuff, just what Git is, why it came about in a land full of VCSs, what sets it apart, and why so many people are using it. +Then, we'll explain how to download Git and set it up for the first time if you don't already have it on your system. + +In *Chapter 2*, we will go over basic Git usage -- how to use Git in the 80% of cases you'll encounter most often. +After reading this chapter, you should be able to clone a repository, see what has happened in the history of the project, modify files, and contribute changes. +If the book spontaneously combusts at this point, you should already be pretty useful wielding Git in the time it takes you to go pick up another copy. + +*Chapter 3* is about the branching model in Git, often described as Git's killer feature. +Here you'll learn what truly sets Git apart from the pack. +When you're done, you may feel the need to spend a quiet moment pondering how you lived before Git branching was part of your life. + +*Chapter 4* will cover Git on the server. +This chapter is for those of you who want to set up Git inside your organization or on your own personal server for collaboration. +We will also explore various hosted options if you prefer to let someone else handle that for you. + +*Chapter 5* will go over in full detail various distributed workflows and how to accomplish them with Git. +When you are done with this chapter, you should be able to work expertly with multiple remote repositories, use Git over email and deftly juggle numerous remote branches and contributed patches. + +*Chapter 6* covers the GitHub hosting service and tooling in depth. +We cover signing up for and managing an account, creating and using Git repositories, common workflows to contribute to projects and to accept contributions to yours, GitHub's programmatic interface and lots of little tips to make your life easier in general. + +*Chapter 7* is about advanced Git commands. +Here you will learn about topics like mastering the scary 'reset' command, using binary search to identify bugs, editing history, revision selection in detail, and a lot more. +This chapter will round out your knowledge of Git so that you are truly a master. + +*Chapter 8* is about configuring your custom Git environment. +This includes setting up hook scripts to enforce or encourage customized policies and using environment configuration settings so you can work the way you want to. +We will also cover building your own set of scripts to enforce a custom committing policy. + +*Chapter 9* deals with Git and other VCSs. +This includes using Git in a Subversion (SVN) world and converting projects from other VCSs to Git. +A lot of organizations still use SVN and are not about to change, but by this point you'll have learned the incredible power of Git -- and this chapter shows you how to cope if you still have to use a SVN server. +We also cover how to import projects from several different systems in case you do convince everyone to make the plunge. + +*Chapter 10* delves into the murky yet beautiful depths of Git internals. +Now that you know all about Git and can wield it with power and grace, you can move on to discuss how Git stores its objects, +what the object model is, details of packfiles, server protocols, and more. +Throughout the book, we will refer to sections of this chapter in case you feel like diving deep at that point; but if you are like us and want to dive into the technical details, you may want to read Chapter 10 first. +We leave that up to you. + +In *Appendix A*, we look at a number of examples of using Git in various specific environments. +We cover a number of different GUIs and IDE programming environments that you may want to use Git in and what is available for you. +If you're interested in an overview of using Git in your shell, your IDE, or your text editor, take a look here. + +In *Appendix B*, we explore scripting and extending Git through tools like libgit2 and JGit. +If you're interested in writing complex and fast custom tools and need low-level Git access, this is where you can see what that landscape looks like. + +Finally, in *Appendix C*, we go through all the major Git commands one at a time and review where in the book we covered them and what we did with them. +If you want to know where in the book we used any specific Git command you can look that up here. + +Let's get started. diff --git a/book/chapters/algorithms-analysis.adoc b/book/content/part01/algorithms-analysis.asc similarity index 90% rename from book/chapters/algorithms-analysis.adoc rename to book/content/part01/algorithms-analysis.asc index 38361721..fab397fe 100644 --- a/book/chapters/algorithms-analysis.adoc +++ b/book/content/part01/algorithms-analysis.asc @@ -1,16 +1,16 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Fundamentals of Algorithms Analysis +=== Fundamentals of Algorithms Analysis Probably you are reading this book because you want to write better and faster code. How can you do that? Can you time how long it takes to run a program? Of course, you can! [big]#⏱# However, if you run the same program on a smartwatch, cellphone or desktop computer, it will take different times. -image:image3.png[image,width=528,height=137] +image::image3.png[image,width=528,height=137] Wouldn't it be great if we can compare algorithms regardless of the hardware where we run them? That's what *time complexity* is for! @@ -24,7 +24,7 @@ We could also compare the memory "used" by different algorithms, and we called t Before going deeper into space and time complexity, let's cover the basics real quick. -== What are Algorithms? +==== What are Algorithms? Algorithms (as you might know) are steps of how to do some tasks. When you cook, you follow a recipe (or an algorithm) to prepare a dish. Let's say you want to make a pizza. @@ -47,7 +47,7 @@ If you play a game, you are devising strategies (or algorithms) to help you win. TIP: Algorithms are instructions on how to perform a task. -== Comparing Algorithms +==== Comparing Algorithms (((Comparing Algorithms))) Not all algorithms are created equal. There are “good” and “bad” algorithms. The good ones are fast; the bad ones are slow. Slow algorithms cost more money to run. Inefficient algorithms could make some calculations impossible in our lifespan! @@ -65,18 +65,18 @@ To give you a clearer picture of how different algorithms perform as the input s |Find all permutations of a string |4 sec. |> vigintillion years |> centillion years |∞ |∞ |============================================================================================= -Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. +Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. -From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. +From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. Organizing 1 million elements with merge sort takes 20 seconds while bubble sort takes 12 days, ouch! The amazing thing is that both programs are solving the same problem with equal data and hardware; and yet, there's a big difference in time! After completing this book, you are going to _think algorithmically_. You will be able to scale your programs while you are designing them. -Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# +Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# <<< -== Increasing your code performance +==== Increasing your code performance The first step to improve your code performance is to measure it. As somebody said: @@ -86,14 +86,14 @@ Measurement is the first step that leads to control and eventually to improvemen In this section, we are going to learn the basics of measuring our current code performance and compare it with other algorithms. -=== Calculating Time Complexity +===== Calculating Time Complexity (((Time complexity))) Time complexity, in computer science, is a function that describes the number of operations a program will execute given the size of the input `n`. How do you get a function that gives you the number of operations that will be executed? Well, we count line by line and mind code inside loops. Let's do an example to explain this point. For instance, we have a function to find the minimum value on an array called `getMin`. .Translating lines of code to an approximate number of operations -image:image4.png[Operations per line] +image::image4.png[Operations per line] Assuming that each line of code is an operation, we get the following: @@ -103,13 +103,13 @@ _3n + 3_ That means that if you have an array of 3 elements e.g. `getMin([3, 2, 9])`, then it will execute around _3(3)+3 = 12_ operations. Of course, this is not for every case. For instance, Line 12 is only executed if the condition on line 11 is met. As you might learn in the next section, we want to get the big picture and get rid of smaller terms to compare algorithms easier. -== Space Complexity +==== Space Complexity (((Space Complexity))) Space complexity is similar to time complexity. However, instead of the count of operations executed, it will account for the amount of memory used additionally to the input. For calculating the *space complexity* we keep track of the “variables” and memory used. In the `getMin` example, we just create a single variable called `min`. So, the space complexity is 1. On other algorithms, If we have to use an auxiliary array, then the space complexity would be `n`. -=== Simplifying Complexity with Asymptotic Analysis +===== Simplifying Complexity with Asymptotic Analysis (((Asymptotic Analysis))) When we are comparing algorithms, we don't want to have complex expressions. What would you prefer comparing two algorithms like "3n^2^ + 7n" vs. "1000 n + 2000" or compare them as "n^2^ vs. n"? Well, that when the asymptotic analysis comes to the rescue. @@ -129,7 +129,7 @@ In the previous example, we analyzed `getMin` with an array of size 3; what happ As the input size `n` grows bigger and bigger then the expression _3n + 3_ is closer and closer to _3n_. Dropping terms might look like a stretch at first, but you will see that what matters the most is the higher order terms of the function rather than lesser terms and constants. -=== What is Big O Notation? +===== What is Big O Notation? (((Big O))) There’s a notation called *Big O*, where `O` refers to the *order of the function*. @@ -176,7 +176,7 @@ This just an illustration since in different hardware the times will be slightly NOTE: These times are under the assumption of running on 1 GHz CPU and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. Regardless, bad algorithms would perform poorly even on a supercomputer. -== Summary +==== Summary In this chapter, we learned how you could measure your algorithm performance using time complexity. Rather than timing how long your program takes to run you can approximate the number of operations it will perform based on the input size. diff --git a/book/chapters/big-o-examples.adoc b/book/content/part01/big-o-examples.asc similarity index 82% rename from book/chapters/big-o-examples.adoc rename to book/content/part01/big-o-examples.asc index 171553b1..38cb3ba5 100644 --- a/book/chapters/big-o-examples.adoc +++ b/book/content/part01/big-o-examples.asc @@ -1,14 +1,13 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Big O examples -// = Eight Running Times You Should Know +=== Big O examples There are many kinds of algorithms. Most of them fall into one of the eight of the time complexities that we are going to explore in this chapter. -.Most common time complexities +.Eight Running Time complexity You Should Know - Constant time: _O(1)_ - Logarithmic time: _O(log n)_ - Linear time: _O(n)_ @@ -23,17 +22,18 @@ We a going to provide examples for each one of them. Before we dive in, here’s a plot with all of them. .CPU operations vs. Algorithm runtime as the input size grows -image:image5.png[CPU time needed vs. Algorithm runtime as the input size increases] +image::image5.png[CPU time needed vs. Algorithm runtime as the input size increases] The above chart shows how the running time of an algorithm is related to the amount of work the CPU has to perform. As you can see O(1) and O(log n) are very scalable. However, O(n^2^) and worst can make your computer run for years [big]#😵# on large datasets. We are going to give some examples so you can identify each one. -== Constant +[[constant]] +==== Constant (((Constant))) (((Runtime, Constant))) Represented as *O(1)*, it means that regardless of the input size the number of operations executed is always the same. Let’s see an example. [#constant-example] -=== Finding if an array is empty +===== Finding if an array is empty Let's implement a function that finds out if an array is empty or not. @@ -45,18 +45,19 @@ Let's implement a function that finds out if an array is empty or not. include::{codedir}/runtimes/01-is-empty.js[tag=isEmpty] ---- -Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. +Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performance than this! -== Logarithmic +[[logarithmic]] +==== Logarithmic (((Logarithmic))) (((Runtime, Logarithmic))) Represented in Big O notation as *O(log n)*, when an algorithm has this running time it means that as the size of the input grows the number of operations grows very slowly. Logarithmic algorithms are very scalable. One example is the *binary search*. indexterm:[Runtime, Logarithmic] -[#logarithmic-example] -=== Searching on a sorted array +[[logarithmic-example]] +===== Searching on a sorted array The binary search only works for sorted lists. It starts searching for an element on the middle of the array and then it moves to the right or left depending if the value you are looking for is bigger or smaller. @@ -71,13 +72,14 @@ This binary search implementation is a recursive algorithm, which means that the Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. -== Linear +[[linear]] +==== Linear (((Linear))) (((Runtime, Linear))) Linear algorithms are one of the most common runtimes. It’s represented as *O(n)*. Usually, an algorithm has a linear running time when it iterates over all the elements in the input. -[#linear-example] -=== Finding duplicates in an array using a map +[[linear-example]] +===== Finding duplicates in an array using a map Let’s say that we want to find duplicate elements in an array. What’s the first implementation that comes to mind? Check out this implementation: @@ -97,13 +99,14 @@ As we learned before, the big O cares about the worst-case scenario, where we wo Space complexity is also *O(n)* since we are using an auxiliary data structure. We have a map that in the worst case (no duplicates) it will hold every word. -== Linearithmic +[[linearithmic]] +==== Linearithmic (((Linearithmic))) (((Runtime, Linearithmic))) An algorithm with a linearithmic runtime is represented as _O(n log n)_. This one is important because it is the best runtime for sorting! Let’s see the merge-sort. -[#linearithmic-example] -=== Sorting elements in an array +[[linearithmic-example]] +===== Sorting elements in an array The ((Merge Sort)), like its name indicates, has two functions merge and sort. Let’s start with the sort function: @@ -129,21 +132,22 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge] The merge function combines two sorted arrays in ascending order. Let’s say that we want to sort the array `[9, 2, 5, 1, 7, 6]`. In the following illustration, you can see what each function does. .Mergesort visualization. Shows the split, sort and merge steps -image:image11.png[Mergesort visualization,width=500,height=600] +image::image11.png[Mergesort visualization,width=500,height=600] How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work we have *O(n log n)*. There more formal ways to reach to this runtime like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. -== Quadratic +[[quadratic]] +==== Quadratic (((Quadratic))) (((Runtime, Quadratic))) Running times that are quadratic, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. Usually, they have double-nested loops that where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. -[#quadratic-example] -=== Finding duplicates in an array (naïve approach) +[[quadratic-example]] +===== Finding duplicates in an array (naïve approach) -If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: +If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: // image:image12.png[image,width=527,height=389] @@ -155,15 +159,16 @@ include::{codedir}/runtimes/05-has-duplicates-naive.js[tag=hasDuplicates] As you can see, we have two nested loops causing the running time to be quadratic. How much different is a linear vs. quadratic algorithm? -Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# +Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# -== Cubic +[[cubic]] +==== Cubic (((Cubic))) (((Runtime, Cubic))) Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. As an example of a cubic algorithm is a multi-variable equation solver (using brute force): -[#cubic-example] -=== Solving a multi-variable equation +[[cubic-example]] +===== Solving a multi-variable equation Let’s say we want to find the solution for this multi-variable equation: @@ -183,15 +188,16 @@ WARNING: This just an example, there are better ways to solve multi-variable equ As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we can refer as a *polynomial runtime*. -== Exponential +[[exponential]] +==== Exponential (((Exponential))) (((Runtime, Exponential))) Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish on your lifetime. [big]#💀# Let’s do an example. -[#exponential-example] -=== Finding subsets of a set +[[exponential-example]] +===== Finding subsets of a set Finding all distinct subsets of a given set can be implemented as follows: @@ -213,7 +219,8 @@ include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] Every time the input grows by one the resulting array doubles. That’s why it has an *O(2^n^)*. -== Factorial +[[factorial]] +==== Factorial (((Factorial))) (((Runtime, Factorial))) Factorial runtime, O(n!), is not scalable at all. Even with input sizes of ~10 elements, it will take a couple of seconds to compute. It’s that slow! [big]*🍯🐝* @@ -229,8 +236,8 @@ A factorial is the multiplication of all the numbers less than itself down to 1. - 11! = 39,916,800 **** -[#factorial-example] -=== Getting all permutations of a word +[[factorial-example]] +===== Getting all permutations of a word (((Permutations))) (((Words permutations))) One classic example of an _O(n!)_ algorithm is finding all the different words that can be formed with a given set of letters. @@ -247,7 +254,7 @@ As you can see in the `getPermutations` function, the resulting array is the fac Factorial start very slow and then it quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! [big]*🤯* -== Summary +==== Summary We went through 8 of the most common time complexities and provided examples for each of them. Hopefully, this will give you a toolbox to analyze algorithms. (((Tables, Intro, Common time complexities and examples))) @@ -261,35 +268,35 @@ We went through 8 of the most common time complexities and provided examples for |Example(s) |O(1) -|<> -|<> +|<> +|<> |O(log n) -|<> -|<> +|<> +|<> |O(n) -|<> -|<> +|<> +|<> |O(n log n) -|<> -|<> +|<> +|<> |O(n^2^) -|<> -|<> +|<> +|<> |O(n^3^) -|<> -|<> +|<> +|<> |O(2^n^) -|<> -|<> +|<> +|<> |O(n!) -|<> -|<> +|<> +|<> |=== // end::table[] diff --git a/book/chapters/linear-data-structures-outro.adoc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc similarity index 57% rename from book/chapters/linear-data-structures-outro.adoc rename to book/content/part02/array-vs-list-vs-queue-vs-stack.asc index dc0a0696..127ce33b 100644 --- a/book/chapters/linear-data-structures-outro.adoc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -1,4 +1,9 @@ -= Array vs. Linked List & Queue vs. Stack +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Array vs. Linked List & Queue vs. Stack In this part of the book, we explored the most used linear data structures such as Arrays, Linked Lists, Stacks and Queues. We implemented them and discussed the runtime of their operations. @@ -13,23 +18,24 @@ In this part of the book, we explored the most used linear data structures such .Use a Queue when: * You need to access your data in a first-come, first served basis (FIFO). -* You need to implement a <> +* You need to implement a <> .Use a Stack when: * You need to access your data as last-in, first-out (LIFO). -* You need to implement a <> +* You need to implement a <> (((Tables, Linear DS, Array/Lists/Stack/Queue complexities))) +[[linear-data-structures-table]] // tag::table[] .Time/Space Complexity of Linear Data Structures (Array, LinkedList, Stack & Queues) |=== .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) -| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) +| <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) | Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) |=== // end::table[] diff --git a/book/chapters/array.adoc b/book/content/part02/array.asc similarity index 94% rename from book/chapters/array.adoc rename to book/content/part02/array.asc index 4d89ddda..41bd6ef3 100644 --- a/book/chapters/array.adoc +++ b/book/content/part02/array.asc @@ -1,14 +1,15 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Array +[[array]] +=== Array (((Array))) (((Data Structures, Linear, Array))) Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. -== Array Basics +==== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. @@ -22,11 +23,11 @@ Some programming languages have fixed size arrays like Java and C++. Fixed size Arrays look like this: .Array representation: each value is accessed through an index. -image:image16.png[image,width=388,height=110] +image::image16.png[image,width=388,height=110] Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. -== Insertion +==== Insertion Arrays are built-in into most languages. Inserting an element is simple; you can either add them on creation time or after initialization. Below you can find an example for both cases: @@ -54,7 +55,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] The runtime for inserting elements using index is always is constant: _O(1)_. -=== Inserting at the beginning of the array +===== Inserting at the beginning of the array What if you want to insert a new element at the beginning of the array? You would have to push every item to the right. @@ -75,7 +76,7 @@ The `unshift()` method adds one or more elements to the beginning of an array an Runtime: O(n). **** -=== Inserting at the middle of the array +===== Inserting at the middle of the array Inserting a new element in the middle involves moving part of the array but not all of the items. @@ -97,7 +98,7 @@ The `splice()` method changes the contents of an array by removing existing elem Runtime: O(n). **** -=== Inserting at the end of the array +===== Inserting at the end of the array We can push new values to the end of the array like this: @@ -119,7 +120,8 @@ The `push()` method adds one or more elements to the end of an array and returns Runtime: O(1). **** -== Searching by value and index +[[array-search-by-value]] +==== Searching by value and index Searching by index is very easy using the `[]` operator: @@ -180,11 +182,11 @@ function searchByValue(array, value) { We would have to loop through the whole array (worst case) or until we find it: *O(n)*. -== Deletion +==== Deletion Deleting (similar to insertion) there are three possible scenarios, removing at the beginning, middle or end. -=== Deleting element from the beginning +===== Deleting element from the beginning Deleting from the beginning can be done using the `splice` function and also the `shift`. For simplicity, we will use the latter. @@ -207,7 +209,7 @@ The `shift()` method shift all elements to the left. In turn, it removes the fir Runtime: O(n). **** -=== Deleting element from the middle +===== Deleting element from the middle We can use the `splice` method for deleting an item from the middle of an array. @@ -223,7 +225,7 @@ array.splice(2, 1); // ↪️[2] <1> Deleting from the middle might cause most the elements of the array to move back one position to fill in for the eliminated item. Thus, runtime: O(n). -=== Deleting element from the end +===== Deleting element from the end Removing the last element is very straightforward: @@ -244,7 +246,7 @@ The `pop()` method removes the last element from an array and returns that eleme Runtime: O(1). **** -== Array Complexity +==== Array Complexity To sum up, the time complexity of an array is: (((Tables, Linear DS, Array Complexities))) diff --git a/book/chapters/linked-list.adoc b/book/content/part02/linked-list.asc similarity index 89% rename from book/chapters/linked-list.adoc rename to book/content/part02/linked-list.asc index 50f103cf..f253ac34 100644 --- a/book/chapters/linked-list.adoc +++ b/book/content/part02/linked-list.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Linked List +[[linked-list]] +=== Linked List (((Linked List))) (((List))) (((Data Structures, Linear, Linked List))) @@ -14,22 +15,23 @@ A list (or Linked List) is a linear data structure where each node is "linked" t - Doubly: every node has a reference to the next and previous object - Circular: the last element points to the first one. - -== Singly Linked List +[[singly-linked-list]] +==== Singly Linked List Each element or node is *connected* to the next one by a reference. When a node only has one connection it's called *singly linked list*: .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. -image:image19.png[image,width=498,height=97] +image::image19.png[image,width=498,height=97] Usually, a Linked List is referenced by the first element in called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. -== Doubly Linked List +[[doubly-linked-list]] +==== Doubly Linked List When each node has a connection to the `next` item and also the `previous` one, then we have a *doubly linked list*. .Doubly Linked List: each node has a reference to the next and previous element. -image:image20.png[image,width=528,height=74] +image::image20.png[image,width=528,height=74] With a doubly list you can not only move forward but also backward. If you keep the reference to the last element (`cat`) you can step back and reach the middle part. @@ -43,7 +45,7 @@ If we implement the code for the `Node` elements, it would be something like thi include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ---- -== Linked List vs. Array +==== Linked List vs. Array Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t always an array more efficient with _O(1)_ access time? It depends. @@ -53,7 +55,7 @@ Another difference is that adding/deleting at the beginning on an array takes O( A drawback of a linked list is that if you want to insert/delete an element at the end of the list, you would have to navigate the whole collection to find the last one O(n). However, this can be solved by keeping track of the last element in the list. We are going to implement that! -== Implementing a Linked List +==== Implementing a Linked List We are going to implement a doubly linked list. First, let's start with the constructor. @@ -70,7 +72,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. -== Searching by value +==== Searching by value Finding an element by value there’s no other way than iterating through the whole list. @@ -97,7 +99,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent= We are going to use this `find` method again to implement searching by index. -== Searching by index +==== Searching by index Searching by index is very similar, we iterate through the list until we find the element that matches the position. @@ -109,22 +111,21 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. -== Insertion +==== Insertion Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. -=== Inserting elements at the beginning of the list +[[linked-list-inserting-beginning]] +===== Inserting elements at the beginning of the list We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. .Insert at the beginning by linking the new node with the current first node. -image:image23.png[image,width=498,height=217] +image::image23.png[image,width=498,height=217] To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: -[#linked-list-inserting-beginning] - .Add item to the beginning of a Linked List [source, javascript] ---- @@ -134,12 +135,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addFirst, ind As you can see, we create a new node and make it the first one. -=== Inserting element at the end of the list +===== Inserting element at the end of the list Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list -image:image24.png[image,width=498,height=208] +image::image24.png[image,width=498,height=208] .Linked List's add to the end of the list implementation [source, javascript] @@ -150,7 +151,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, inde If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. -=== Inserting element at the middle of the list +===== Inserting element at the middle of the list For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. @@ -170,7 +171,7 @@ art <-> dog <-> cat We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. -image:image25.png[image,width=528,height=358] +image::image25.png[image,width=528,height=358] Take a look into the implementation of https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js#L83[LinkedList.add]: @@ -189,16 +190,16 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, in Take notice that we reused, `addFirst` and `addLast` methods. For all the other cases the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting on the middle takes *O(n)* because we have to iterate through the list using the `get` method. -== Deletion +==== Deletion Deleting is an interesting one. We don’t delete an element; we remove all references to that node. Let’s go case by case to explore what happens. -=== Deleting element from the head +===== Deleting element from the head Deleting the first element (or head) is a matter of removing all references to it. .Deleting an element from the head of the list -image:image26.png[image,width=528,height=74] +image::image26.png[image,width=528,height=74] For instance, to remove the head (“art”) node, we change the variable `first` to point to the second node “dog”. We also remove the variable `previous` from the "dog" node, so it doesn't point to the “art” node. The garbage collector will get rid of the “art” node when it seems nothing is using it anymore. @@ -210,12 +211,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeFirst, As you can see, when we want to remove the first node we make the 2nd element the first one. -=== Deleting element from the tail +===== Deleting element from the tail Removing the last element from the list would require to iterate from the head until we find the last one, that’s O(n). But, If we have a reference to the last element, which we do, We can do it in _O(1)_ instead! .Removing last element from the list using the last reference. -image:image27.png[image,width=528,height=221] +image::image27.png[image,width=528,height=221] For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat” then is out of the list and eventually is deleted from memory by the garbage collector. @@ -229,12 +230,12 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. -=== Deleting element from the middle +===== Deleting element from the middle To remove a node from the middle, we make the surrounding nodes to bypass the one we want to delete. .Remove the middle node -image:image28.png[image,width=528,height=259] +image::image28.png[image,width=528,height=259] In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art” totally bypassing “dog”. @@ -249,7 +250,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeByPosit Notice that we are using the `get` method to get the node at the current position. That method loops through the list until it found the node at the specified location. This iteration has a runtime of _O(n)_. -== Linked List Complexity vs. Array Complexity +==== Linked List Complexity vs. Array Complexity So far, we have seen two liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) @@ -278,9 +279,9 @@ Use arrays when: Use a doubly linked list when: -* You want to access elements in a *sequential* manner only like <> or <>. +* You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). * You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. diff --git a/book/chapters/queue.adoc b/book/content/part02/queue.asc similarity index 93% rename from book/chapters/queue.adoc rename to book/content/part02/queue.asc index 73d85b86..a20f2f22 100644 --- a/book/chapters/queue.adoc +++ b/book/content/part02/queue.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Queue +[[queue]] +=== Queue (((Queue))) (((Data Structures, Linear, Queue))) (((First-In First-out))) @@ -11,7 +12,7 @@ endif::[] A queue is a linear data structure where the data flows in a *First-In-First-Out* (FIFO) manner. .Queue data structure is like a line of people: the First-in, is the First-out -image:image30.png[image,width=528,height=171] +image::image30.png[image,width=528,height=171] A queue is like a line of people at the bank; the person that arrived first is the first to go out as well. @@ -29,7 +30,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=constructor] We initialize the Queue creating a linked list. Now, let’s add the `enqueue` and `dequeue` methods. -== Insertion +==== Insertion (((Enqueue))) For inserting elements on queue, also know as *enqueue*, we add items to the back of the list using `addLast`: @@ -41,7 +42,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=enqueue, indent=0] As discussed, this operation has a constant runtime. -== Deletion +==== Deletion (((Dequeue))) For removing elements from a queue, also know as *dequeue*, we remove elements from the front of the list using `removeFirst`: @@ -53,7 +54,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=dequeue, indent=0] As discussed, this operation has a constant runtime. -== Implementation usage +==== Implementation usage We can use our Queue class like follows: @@ -65,7 +66,7 @@ include::{codedir}/data-structures/queues/queue.js[tag=snippet, indent=0] You can see that the items are dequeue in the same order they were added, FIFO (first-in, first out). -== Queue Complexity +==== Queue Complexity As an experiment, we can see in the following table that if we had implemented the Queue using an array, its enqueue time would be _O(n)_ instead of _O(1)_. Check it out: (((Tables, Linear DS, Queue complexities))) diff --git a/book/chapters/stack.adoc b/book/content/part02/stack.asc similarity index 91% rename from book/chapters/stack.adoc rename to book/content/part02/stack.asc index b499e86f..6b4df7dc 100644 --- a/book/chapters/stack.adoc +++ b/book/content/part02/stack.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Stack +[[stack]] +=== Stack (((Stack))) (((Data Structures, Linear, Stack))) (((Last-In First-out))) @@ -13,7 +14,7 @@ The stack is a data structure that restricts the way you add and remove data. It An analogy is to think the stack is a rod and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out -image:image29.png[image,width=240,height=238] +image::image29.png[image,width=240,height=238] // #Change image from https://www.khanacademy.org/computing/computer-science/algorithms/towers-of-hanoi/a/towers-of-hanoi[Khan Academy]# @@ -33,7 +34,7 @@ As you can see in the stack constructor, we are using a linked list as the unde Let's now develop the insert and remove operations in a stack. -== Insertion +==== Insertion We can insert into a stack using the linked list’s `addLast` method. @@ -45,7 +46,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=add, indent=0] We are returning `this`, in case we want to chain multiple add commands. -== Deletion +==== Deletion Deleting is straightforward as well. @@ -57,7 +58,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=remove, indent=0] This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the full implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[here]. -== Implementation Usage +==== Implementation Usage We can use our stack implementation as follows: @@ -69,7 +70,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=snippet, indent=0] As you can see if we add new items they will be the first to go out to honor LIFO. -== Stack Complexity +==== Stack Complexity Implementing the stack with an array and linked list would lead to the same time complexity: (((Tables, Linear DS, Stack complexities))) @@ -83,4 +84,4 @@ Implementing the stack with an array and linked list would lead to the same time |=== // end::table[] -It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks especially useful for implementing <>. +It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks especially useful for implementing <>. diff --git a/book/chapters/tree-binary-tree-traversal.adoc b/book/content/part03/binary-search-tree-traversal.asc similarity index 94% rename from book/chapters/tree-binary-tree-traversal.adoc rename to book/content/part03/binary-search-tree-traversal.asc index 875c649e..58555c91 100644 --- a/book/chapters/tree-binary-tree-traversal.adoc +++ b/book/content/part03/binary-search-tree-traversal.asc @@ -1,13 +1,13 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Binary Tree Traversal +=== Binary Tree Traversal (((Binary Tree Traversal))) As mentioned before, there are different ways to visit all the nodes or search for a value in a binary tree. On this section, we are going to focus on depth-first tree traversal. -== In Order Traversal +==== In Order Traversal (((Tree Traversal, In Order))) (((In Order Traversal))) If your tree happens to be a binary search tree (BST), then you can use "in order" traversal to get the values sorted in ascending order. To accomplish this, you have to visit the nodes in a `left-root-right` order. @@ -35,7 +35,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=inOrderTraver This function goes recursively to the leftmost element and then yield that node, then we go to the right child (if any) and repeat the process. This method will get us the values ordered. -== Pre Order Traversal +==== Pre Order Traversal (((Tree Traversal, Pre Order))) (((Pre Order Traversal))) Pre-order traversal visits nodes in this order `root-left-right` recursively. @@ -64,7 +64,7 @@ If we have the following tree: Pre-order traverval will return `10, 5, 4, 3, 30, 15, 40`. -== Post-order Traversal +==== Post-order Traversal (((Tree Traversal, Post Order))) (((Post Order Traversal))) Post-order traversal goes to each node in this order `left-right-root` recursively. diff --git a/book/chapters/tree-binary-search-tree.adoc b/book/content/part03/binary-search-tree.asc similarity index 91% rename from book/chapters/tree-binary-search-tree.adoc rename to book/content/part03/binary-search-tree.asc index 68adf401..4c506cda 100644 --- a/book/chapters/tree-binary-search-tree.adoc +++ b/book/content/part03/binary-search-tree.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Binary Search Tree +=== Binary Search Tree (((Binary Search Tree))) (((BST))) (((Data Structures, Non-Linear, Binary Search Tree))) @@ -14,7 +14,7 @@ endif::[] * The order of nodes values must be: `left child < parent < right child`. * Nodes might need re-ordering after each insert/delete operation to keep the `left <= parent < right` constraint. -== Implementing a Binary Search Tree +==== Implementing a Binary Search Tree The first step is to implement the Binary Tree Node, which can hold 0, 1 or 2 children. @@ -47,7 +47,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=snippet, inde With the methods `add` and `remove` we have to guarantee that our tree always has one root element from where we can navigate left or right based on the value that we are looking for. Let's implement those `add` method first: -=== Inserting new elements in a BST +===== Inserting new elements in a BST .For inserting an element, in a BST, we have two scenarios: 1. If the tree is empty (root element is null), we add the newly created node as root, and that's it! @@ -57,7 +57,7 @@ With the methods `add` and `remove` we have to guarantee that our tree always ha For instance, let’s say that we want to insert the values 19, 21, 10, 2, 8 in a BST: .Inserting values on a BST. -image:image36.png[image,width=528,height=329] +image::image36.png[image,width=528,height=329] In the last box of the image above, when we are inserting node 18, we start by the root (19). Since 18 is less than 19, then we move left. Node 18 is greater than 10, so we move right. There’s an empty spot, and we place it there. Let’s code it up: @@ -69,7 +69,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=add, indent=0 <1> We are using a helper function `findNodeAndParent` to iterate through the tree finding a node with current value “found” and its parent (implementation on the next section). <2> We are taking care of duplicates. Instead of inserting duplicates we are keeping a multiplicity tally. We have to decrease it when removing nodes. -=== Finding a value in a BST +===== Finding a value in a BST We can implement the find method using the helper `findNodeAndParent` as follows: @@ -81,7 +81,7 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=find, indent= `findNodeAndParent` is a recursive function that goes to the left child or right depending on the value. However, if the value already exists, it will return it in `found` variable. -=== Removing elements from a BST +===== Removing elements from a BST Deleting a node from a BST have three cases. @@ -90,39 +90,39 @@ Deleting a node from a BST have three cases. 2. parent with one child 3. parent with two children/root. -==== Removing a leaf (Node with 0 children) +====== Removing a leaf (Node with 0 children) Deleting a leaf is the easiest; we look for their parent and set the child to null. .Removing node without children from a BST. -image:image37.png[image,width=528,height=200] +image::image37.png[image,width=528,height=200] Node 18, will be hanging around until the garbage collector is run. However, there’s no node referencing to it so it won’t be reachable from the tree anymore. -==== Removing a parent (Node with 1 children) +====== Removing a parent (Node with 1 children) Removing a parent is not as easy since you need to find new parents for its children. .Removing node with 1 children from a BST. -image:image38.png[image,width=528,height=192] +image::image38.png[image,width=528,height=192] In the example, we removed node `10` from the tree, so its child (node 2) needs a new parent. We made node 19 the new parent for node 2. -==== Removing a full parent (Node with 2 children) or root +====== Removing a full parent (Node with 2 children) or root Removing a parent of two children is the trickiest of all cases because we need to find new parents for two children. (This sentence sounds tragic out of context 😂) .Removing node with two children from a BST. -image:image39.png[image,width=528,height=404] +image::image39.png[image,width=528,height=404] In the example, we delete the root node 19. This deletion leaves two orphans (node 10 and node 21). There are no more parents because node 19 was the *root* element. One way to solve this problem is to *combine* the left subtree (Node 10 and descendants) into the right subtree (node 21). The final result is node 21 is the new root. What would happen if node 21 had a left child (e.g., node 20)? Well, we would move node 10 and its descendants' bellow node 20. -==== Implementing removing elements from a BST +====== Implementing removing elements from a BST All the described scenarios removing nodes with zero, one and two children can be sum up on this code: @@ -158,16 +158,16 @@ include::{codedir}/data-structures/trees/binary-search-tree.js[tag=leftMost, ind That’s all we need to remove elements from a BST. Check out the complete BST implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/trees/binary-search-tree.js#L5[here]. -== Differentiating a balanced and non-balanced Tree +==== Differentiating a balanced and non-balanced Tree As we insert and remove nodes from a BST we could end up like the tree on the left: .Balanced vs. Unbalanced Tree. -image:image40.png[image,width=454,height=201] +image::image40.png[image,width=454,height=201] The tree on the left is unbalanced. It looks like a Linked List and has the same runtime! Searching for an element would be *O(n)*, yikes! However, on a balanced tree, the search time is *O(log n)*, which is pretty good! That’s why we always want to keep the tree balanced. In further chapters, we are going to explore how to keep a tree balanced after each insert/delete. -== Tree Complexity +==== Tree Complexity We can sum up the tree operations using Big O notation: (((Tables, Non-Linear DS, Binary Search Tree complexities))) diff --git a/book/chapters/graph-search.adoc b/book/content/part03/graph-search.asc similarity index 65% rename from book/chapters/graph-search.adoc rename to book/content/part03/graph-search.asc index cb64a3bc..d19d5fd6 100644 --- a/book/chapters/graph-search.adoc +++ b/book/content/part03/graph-search.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Graph Search +=== Graph Search Graph search allows you to visit search elements. @@ -11,36 +11,38 @@ WARNING: Graph search is very similar to <>. So, if yo There are two ways to navigate the graph, one is using Depth-First Search (DFS) and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. -[graphviz, directed graph, png] -.... -digraph G { +image::directed-graph.png[directed graph] - node [fillcolor="#F8E71C" style=filled shape=circle] 0; - node [fillcolor="#F5A623"] 1; - node [fillcolor="#B8E986"] 2; - node [fillcolor="#BD10E0"] 3; - node [fillcolor="#50E3C2"] 4; - node [fillcolor="#4A90E2"] 5; - // node [fillcolor="#FF5252"] 6; +// [graphviz, directed graph, png] +// .... +// digraph G { - 0 -> 5 - 0 -> 4 - 0 -> 1 - 1 -> 4 - 1 -> 3 - 2 -> 1 - 3 -> 4 - 3 -> 2 +// node [fillcolor="#F8E71C" style=filled shape=circle] 0; +// node [fillcolor="#F5A623"] 1; +// node [fillcolor="#B8E986"] 2; +// node [fillcolor="#BD10E0"] 3; +// node [fillcolor="#50E3C2"] 4; +// node [fillcolor="#4A90E2"] 5; +// // node [fillcolor="#FF5252"] 6; - // label="DFS" +// 0 -> 5 +// 0 -> 4 +// 0 -> 1 +// 1 -> 4 +// 1 -> 3 +// 2 -> 1 +// 3 -> 4 +// 3 -> 2 - { rank=same; 3, 1 } - { rank=same; 0, 4 } +// // label="DFS" -} -.... +// { rank=same; 3, 1 } +// { rank=same; 0, 4 } -== Depth-First Search for Graphs +// } +// .... + +==== Depth-First Search for Graphs With Depth-First Search (DFS) we go deep before going wide. @@ -52,7 +54,7 @@ So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. // TODO: add arrows to show DFS and create another one for BFS -== Breadth-First Search for Graphs +==== Breadth-First Search for Graphs With Breadth-First Search (BFS) we go wide before going deep. @@ -64,7 +66,7 @@ After all the children of node `0` are visited it continue with all the children In summary, BFS would visit the graph: `[0, 5, 1, 4, 3, 2]` -== Depth-First Search vs. Breadth-First Search in a Graph +==== Depth-First Search vs. Breadth-First Search in a Graph DFS and BFS can implementation can be almost identical; the difference is the underlying data structured. In our implementation, we have a generic `graphSearch` where we pass the first element to start the search the data structure that we can to use: @@ -74,13 +76,13 @@ DFS and BFS can implementation can be almost identical; the difference is the un include::{codedir}/data-structures/graphs/graph.js[tag=graphSearch,indent=0] ---- -Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. +Using an <> (LIFO) for DFS will make use keep visiting the last node children while having a <> (FIFO) will allow to visit adjacent nodes first and "queue" their children for later visiting. -TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. +TIP: you can also implement the DFS as a recursive function, similar to what we did in the <>. You might wonder what the difference between search algorithms in a tree and a graph is? Check out the next section. -== DFS/BFS on Tree vs Graph +==== DFS/BFS on Tree vs Graph The difference between searching a tree and a graph is that the tree always has a starting point (root node). However, in a graph, you can start searching anywhere. There's no root. diff --git a/book/chapters/graph.adoc b/book/content/part03/graph.asc similarity index 91% rename from book/chapters/graph.adoc rename to book/content/part03/graph.asc index a4ee9352..35d15b40 100644 --- a/book/chapters/graph.adoc +++ b/book/content/part03/graph.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Graph +[[graph]] +=== Graph (((Graph))) (((Data Structures, Non-Linear, Graph))) Graphs are one of my favorite data structures. @@ -26,32 +27,32 @@ The only difference is that it uses an *array* of adjacent nodes instead of just Other difference between a linked list and graph is that a linked list always has a root node (or first element), while the graph doesn’t. You can start traversing a graph from anywhere. Let’s examine these graph properties! -== Graph Properties +==== Graph Properties The connection between two nodes is called *edge*. Also, nodes might be called *vertex*. .Graph is composed of vertices/nodes and edges -image:image42.png[image,width=305,height=233] +image::image42.png[image,width=305,height=233] -=== Directed Graph vs Undirected +===== Directed Graph vs Undirected A graph can be either *directed* or *undirected*. .Graph: directed vs undirected -image:image43.jpg[image,width=469,height=192] +image::image43.jpg[image,width=469,height=192] An *undirected graph* has edges that are *two-way street*. E.g., On the undirected example, you can traverse from the green node to the orange and vice versa. A *directed graph (digraph)* has edges that are *one-way street*. E.g., On the directed example, you can only go from green node to orange and not the other way around. When one node has an edge to itself is called a *self-loop*. -=== Graph Cycles +===== Graph Cycles A graph can have *cycles* or not. .Cyclic vs Acyclic Graphs. -image:image44.jpg[image,width=444,height=194] +image::image44.jpg[image,width=444,height=194] (((Cyclic Graph))) A *cyclic graph* is the one that you can pass through a node more than once. @@ -64,10 +65,10 @@ An acyclic graph is the one that you can’t pass through a node more than once. (((DAG))) The *Directed Acyclic Graph (DAG)* is unique. It has many applications like scheduling tasks, spreadsheets change propagation, and so forth. DAG is also called *Tree* data structure only when each node has only *one parent*. -=== Connected vs Disconnected vs Complete Graphs +===== Connected vs Disconnected vs Complete Graphs .Different kinds of graphs: disconnected, connected, and complete. -image:image45.png[image,width=1528,height=300] +image::image45.png[image,width=1528,height=300] A *disconnected graph* is one that has one or more subgraph. In other words, a graph is *disconnected* if two nodes don’t have a path between them. @@ -75,16 +76,16 @@ A *connected graph* is the opposite to disconnected, there’s a path between ev A *complete graph* is where every node is adjacent to all the other nodes in the graph. E.g., If there are seven nodes, every node has six edges. -=== Weighted Graphs +===== Weighted Graphs (((Weighted Graphs))) Weighted graphs have labels in the edges (a.k.a *weight* or *cost*). The link weight can represent many things like distance, travel time, or anything else. .Weighted Graph representing USA airports distance in miles. -image:image46.png[image,width=528,height=337] +image::image46.png[image,width=528,height=337] For instance, a weighted graph can have a distance between nodes. So, algorithms can use the weight and optimize the path between them. -== Exciting Graph applications in real-world +==== Exciting Graph applications in real-world Now that we know what graphs are and some of their properties. Let’s discuss some real-life usages of graphs. @@ -107,19 +108,19 @@ Graphs become a metaphor where nodes and edges model something from our physical There are endless applications for graphs in electronics, social networks, recommendation systems and many more. That’s cool and all, but how do we represent graphs in code? Let’s see that in the next section. -== Representing Graphs +==== Representing Graphs There are two main ways to graphs one is: * Adjacency Matrix * Adjacency List -=== Adjacency Matrix +===== Adjacency Matrix (((Adjacency Matrix))) Representing graphs as adjacency matrix is done using a two-dimensional array. For instance, let’s say we have the following graph: .Graph and its adjacency matrix. -image:image47.png[image,width=438,height=253] +image::image47.png[image,width=438,height=253] The number of vertices |V| define the size of the matrix. In the example, we have five vertices, so we have a 5x5 matrix. @@ -161,16 +162,16 @@ TIP: When the graph has few connections compared to the number of nodes we say t The space complexity of the adjacency matrix is *O(|V|^2^)*, where |V| is the number of vertices/nodes. -=== Adjacency List +===== Adjacency List (((Adjacency List))) Another way to represent a graph is by using an adjacency list. This time instead of using an array (matrix) we use a list. .Graph represented as an Adjacency List. -image:image48.png[image,width=528,height=237] +image::image48.png[image,width=528,height=237] If we want to add a new node to the list, we can do it by adding one element to the end of the array of nodes *O(1)*. In the next section, we are going to explore the running times of all operations in an adjacency list. -== Implementing a Graph data structure +==== Implementing a Graph data structure Since adjacency lists are more efficient (than adjacency matrix), we are going to use to implement a graph data structure. @@ -184,7 +185,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=constructor] Notice that the constructor takes a parameter. The `edgeDirection` allow us to use one class for both undirected and directed graphs. -== Adding a vertex +==== Adding a vertex For adding a vertex, we first need to check if the node already exists. If so, we return the node. @@ -199,7 +200,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=addVertex, indent=0] If the node doesn't exist, then we create the new node and add it to a `HashMap`. -TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. +TIP: <> stores key/pair value very efficiently. Lookup is `O(1)`. The `key` is the node's value, while the `value` is the newly created node. @@ -212,7 +213,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=constructor, indent=0] ---- -== Deleting a vertex +==== Deleting a vertex .Graphs's `removeVertex` method [source, javascript] @@ -235,7 +236,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] All adjacencies are stored as a HashSet to provide constant time deletion. -== Adding an edge +==== Adding an edge An edge is a connection between two nodes (vertices). If the graph is undirected means that every link is a two-way street. When we create the edge from node 1 to node 2, we also need to establish a connection between node 2 and 1 for undirected graphs. @@ -258,7 +259,7 @@ We can add adjacencies using the `addAdjacent` method from the Node class. include::{codedir}/data-structures/graphs/node.js[tag=addAdjacent, indent=0] ---- -== Querying Adjacency +==== Querying Adjacency .Graphs's `areAdjacents` method [source, javascript] @@ -273,7 +274,7 @@ include::{codedir}/data-structures/graphs/node.js[tag=isAdjacent, indent=0] ---- -== Deleting an edge +==== Deleting an edge .Graphs's `removeEdge` method [source, javascript] @@ -287,7 +288,7 @@ include::{codedir}/data-structures/graphs/graph.js[tag=removeEdge, indent=0] include::{codedir}/data-structures/graphs/node.js[tag=removeAdjacent, indent=0] ---- <<< -== Graph Complexity +==== Graph Complexity (((Tables, Non-Linear DS, Graph adjacency matrix/list complexities))) // tag::table[] diff --git a/book/chapters/map-hashmap.adoc b/book/content/part03/hashmap.asc similarity index 95% rename from book/chapters/map-hashmap.adoc rename to book/content/part03/hashmap.asc index 9f4ceabb..2a00067f 100644 --- a/book/chapters/map-hashmap.adoc +++ b/book/content/part03/hashmap.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= HashMap +[[hashmap]] +==== HashMap (((HashMap))) (((HashTable))) (((Data Structures, Non-Linear, HashMap))) @@ -23,7 +24,7 @@ How are the keys mapped to their values? Using a hash function. Here’s an illustration: .Internal HashMap representation -image:image41.png[image,width=528,height=299] +image::image41.png[image,width=528,height=299] .This is the main idea: @@ -36,7 +37,7 @@ In a HashMap, a *collision* is when different keys lead to the same index. They Having a big bucket size can avoid a collision but also can waste too much memory. We are going to build an _optimized_ HashMap that re-sizes itself when it is getting full. This auto-resizing avoids collisions and don't need to allocate too much memory upfront. Let’s start with the *hash function*. -== Designing an optimized hash function +===== Designing an optimized hash function To minimize collisions, we need to create an excellent hash function. @@ -52,7 +53,7 @@ It’s no practical and memory-wise wasteful to have a perfect hash function, so Before doing a great hash function, let's see what a lousy hash function looks like. 😉 -=== Analysing collisions on bad hash code functions +====== Analysing collisions on bad hash code functions The goal of a hash code function is to convert any value given into a positive integer — a common way to accomplish with summing each string’s Unicode value. @@ -152,7 +153,7 @@ Now it’s more evenly distributed!! [big]#😎👍# Let’s design a better HashMap with what we learned. -=== Implementing an optimized hash function +====== Implementing an optimized hash function We are going to use a battle-tested non-cryptographic hash function called FNV Hash. @@ -189,7 +190,7 @@ FVN-1a hash function is a good trade-off between speed and collision prevention. Now that we have a proper hash function. Let’s move on with the rest of the HashMap implementation. -== Implementing a HashMap in JavaScript +===== Implementing a HashMap in JavaScript Let’s start by creating a class and its constructor to initialize the hash map. We are going to have an array called `buckets` to hold all the data. @@ -209,7 +210,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getLoadFactor, Notice that we are also keeping track of collisions (for benchmarking purposes) and a load factor. *The load factor* measures how full the hash map is. We don’t want to be fuller than 75%. If the HashMap is getting too full, then we are going to fix it doing a *rehash* (more on that later). -=== Inserting elements in a HashMap +====== Inserting elements in a HashMap To insert values into a HashMap, we first convert the *key* into an *array index* using the hash and compression function. Each bucket of the array will have an object with the shape of `{key, value}`. @@ -228,7 +229,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=set, indent=0] Notice, that we are using a function called `getEntry` to check if the key already exists. It gets the index of the bucket corresponding to the key and then checks if the entry with the given key exists. We are going to implement this function in a bit. -=== Getting values out of a HashMap +====== Getting values out of a HashMap For getting values out of the Map, we do something similar to inserting. We convert the key into an `index` using the hash function, then we that `index` we look for the value in the bucket. @@ -239,7 +240,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getEntry, inde ---- <1> Convert key to an array index. <2> If the bucket is empty create a new linked list -<3> Use Linked list's <> method to find value on the bucket. +<3> Use Linked list's <> method to find value on the bucket. <4> Return `bucket` and `entry` if found. With the help of the `getEntry` method, we can do the `HashMap.get` and `HashMap.has` methods: @@ -260,7 +261,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=has, indent=0] For `HashMap.has` we only care if the value exists or not, while that for `HashMap.get` we want to return the value or `undefined` if it doesn’t exist. -=== Deleting from a HashMap +====== Deleting from a HashMap Removing items from a HashMap is not too different from what we did before. @@ -274,7 +275,7 @@ If the bucket doesn’t exist or is empty, we don't have to do anything else. If https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L218[`LinkedList.remove` ] method. -== Rehashing a HashMap +===== Rehashing a HashMap Rehashing is a technique to minimize collisions when a hash map is getting full. It doubles the size of the map and recomputes all the hash codes and insert data in the new buckets. @@ -289,7 +290,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=rehash, indent In the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/maps/hash-maps/primes.js#L33[prime.js] file you can find the implementation for finding the next prime. Also, you can see the full HashMap implementation on this file: https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/maps/hash-maps/hash-map.js#L1[hashmap.js] -== HashMap time complexity +===== HashMap time complexity Hash Map it’s very optimal for searching values by key in constant time *O(1)*. However, searching by value is not any better than an array since we have to visit every value *O(n)*. (((Tables, Non-Linear DS, HashMap complexities))) diff --git a/book/chapters/map-hashmap-vs-treemap.adoc b/book/content/part03/map.asc similarity index 55% rename from book/chapters/map-hashmap-vs-treemap.adoc rename to book/content/part03/map.asc index 732d81e1..d03dae4f 100644 --- a/book/chapters/map-hashmap-vs-treemap.adoc +++ b/book/content/part03/map.asc @@ -1,9 +1,39 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= HashMap vs TreeMap +[[map]] +=== Map +(((Map))) +(((Data Structures, Non-Linear, Map))) +A map is a data structure to store pairs of data: *key* and *value*. In an array, you can only store values. The array’s key is always the position index. However, in a *Map* the key can be whatever you want. + +IMPORTANT: Map is a data structure that _maps_ *keys* to *values*. + +Many languages have maps already built-in. JavaScript/Node has `Map`: + +.JavaScript Built-in Map Usage +[source, javascript] +---- +include::{codedir}/data-structures/maps/map.js[tag=snippet, indent=0] +---- + +In short, you set `key`/`value` pair and then you can get the `value` using the `key`. + +The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: + +* *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. +* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. + +<<< +include::hashmap.asc[] + +<<< +include::treemap.asc[] + +<<< +==== HashMap vs TreeMap .A map can be implemented using hash functions or binary search tree: - *HashMap*: it’s a map implementation using an *array* and *hash function*. The job of the hash function is to convert the key into an index that contains the matching data. Optimized HashMap can have an average runtime of *O(1)*. @@ -12,12 +42,12 @@ endif::[] .When to use a TreeMap vs. HashMap? * `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. -* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average.  +* `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. * `HashMap`’s keys are in insertion order (or random depending in the implementation). `TreeMap`’s keys are always sorted. * `TreeMap` offers some statistical data for free such as: get minimum, get maximum, median, find ranges of keys. `HashMap` doesn’t. * `TreeMap` has a guarantee always an *O(log n)*, while `HashMap`s has an amortized time of *O(1)* but in the rare case of a rehash, it would take an *O(n)*. -== TreeMap Time complexity vs HashMap +===== TreeMap Time complexity vs HashMap As we discussed so far, there is a trade-off between the implementations. (((Tables, Non-Linear DS, HashMap/TreeMap complexities))) diff --git a/book/chapters/set.adoc b/book/content/part03/set.asc similarity index 91% rename from book/chapters/set.adoc rename to book/content/part03/set.asc index e1e71980..79dd30e9 100644 --- a/book/chapters/set.adoc +++ b/book/content/part03/set.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Set +[[set]] +=== Set (((Set))) (((Data Structures, Non-Linear, Set))) A set is a data structure where duplicated entries are not allowed. Set is like an array with unique values. @@ -37,9 +38,9 @@ TIP: A hint... it should perform all operations in *O(1)** or at most *O(log n)* If we use a `map`, we can accomplish this. However, maps use a key/value pair. If we only use the keys, we can avoid duplicates. Since in a `map` you can only have one key at a time. -As you might remember from the <> chapter, there are two ways of implementing a `map` and both can be used to create a `set`. Let's explore the difference between the two implementations are. +As you might remember from the <> chapter, there are two ways of implementing a `map` and both can be used to create a `set`. Let's explore the difference between the two implementations are. -== HashSet vs TreeSet +==== HashSet vs TreeSet We can implement a `map` using a *balanced BST* and using a *hash function*. If we use them to implement a `Set`, then we would have a `HashSet` and `TreeSet` respectively. @@ -50,7 +51,8 @@ We can implement a `map` using a *balanced BST* and using a *hash function*. If Let’s implement both! -== TreeSet +[[tree-set]] +==== TreeSet (((TreeSet))) (((Data Structures, Non-Linear, TreeSet))) We are to use a self-balanced BST (Red-Black Tree) to implement TreeSet. @@ -75,7 +77,7 @@ expect(Array.from(set.keys())).toEqual([1, 2, 3]); Ok, now let’s implement the add method. -=== Adding elements to a TreeSet +===== Adding elements to a TreeSet For adding values to the set, we `Tree.add` method. @@ -89,7 +91,7 @@ Our <> can hold duplicated Don’t worry about adding extra lookups. The `Tree.has` is also very performant *O(log n)*. -=== Searching for values in a TreeSet +===== Searching for values in a TreeSet Again, we rely on the Tree implementation to do the heavy lifting: @@ -99,7 +101,7 @@ Again, we rely on the Tree implementation to do the heavy lifting: include::{codedir}/data-structures/sets/tree-set.js[tag=has, indent=0] ---- -=== Deleting elements from a TreeSet +===== Deleting elements from a TreeSet We delete the elements from the TreeSet using the remove method of the BST. @@ -111,7 +113,7 @@ include::{codedir}/data-structures/sets/tree-set.js[tag=delete, indent=0] Voilà! That’s it! -=== Converting TreeSet to Array +===== Converting TreeSet to Array A common use case for a Set is to convert it to an array or use in an iterator (for loops, forEach, …). Let’s provide the method for that: @@ -151,7 +153,8 @@ Check out our https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243c Let’s now, implement a `HashSet`. -== HashSet +[[hashset]] +==== HashSet (((HashSet))) (((Data Structures, Non-Linear, HashSet))) The *HashSet* is the set implementation using a HashMap as its underlying data structure. @@ -167,7 +170,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=constructor] This constructor is useful for converting an array to set and initializing the `HashMap`. -=== Inserting values to a HashSet +===== Inserting values to a HashSet To insert items in a HashSet we use the `set` method of the `HashMap`: @@ -180,7 +183,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=add, indent=0] `HashMap` stores key/value pairs, but for this, we only need the key, and we ignore the value. -=== Finding values in a HashSet +===== Finding values in a HashSet We use the method `has` to check if a value is on the `Set` or not. @@ -193,7 +196,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=has, indent=0] Internally, the `HashMap` will convert the key into an array index using a hash function. If there’s something in the array index bucket, it will return true, and if it’s empty, it will be false. -=== Deleting values from a HashSet +===== Deleting values from a HashSet For deleting a value from a hashSet we use the HashMap’s delete method: @@ -205,7 +208,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=delete, indent=0] This method has an average runtime of *O(1)*. -== HashSet vs HashMap Time Complexity +==== HashSet vs HashMap Time Complexity We can say that `HashMap` in on average more performant O(1) vs. O(log n). However, if a rehash happens, it will take *O(n)* instead of *O(1)*. A `TreeSet` is always *O(log n)*. diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc new file mode 100644 index 00000000..4739c624 --- /dev/null +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -0,0 +1,25 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Summary + +In this section, we learned about Graphs applications, properties and how we can create them. We mention that you can represent a graph as a matrix or as a list of adjacencies. We went for implementing the later since it's more space efficient. We cover the basic graph operations like adding and removing nodes and edges. In the algorithms section, we are going to cover searching values in the graph. +(((Tables, Non-Linear DS, BST/Maps/Sets Complexities))) + +// tag::table[] +.Time and Space Complexity for Graph-based Data Structures +|=== +.2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity +^|_Index/Key_ ^|_Value_ +| <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) +| Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) +| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +|=== +{empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. +// end::table[] diff --git a/book/chapters/tree.adoc b/book/content/part03/tree-intro.asc similarity index 77% rename from book/chapters/tree.adoc rename to book/content/part03/tree-intro.asc index 542c4a7a..632e22ee 100644 --- a/book/chapters/tree.adoc +++ b/book/content/part03/tree-intro.asc @@ -1,21 +1,22 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Tree +[[tree]] +=== Tree (((Tree))) (((Data Structures, Non-Linear, Tree))) A tree is a non-linear data structure where a node can have zero or more connections. The topmost node in a tree is called *root*. The linked nodes to the root are called *children* or *descendants*. .Tree Data Structure: root node and descendants. -image:image31.jpg[image,width=404,height=240] +image::image31.jpg[image,width=404,height=240] As you can see in the picture above, this data structure resembles an inverted tree hence the name. It starts with a *root* node and *branch* off with its descendants, and finally *leaves*. -== Implementing a Tree +==== Implementing a Tree -Implementing a tree is not too hard. It’s similar to a <>. The main difference is that instead of having a `next` and `previous` links, we have an infinite number of linked nodes (children/descendants). +Implementing a tree is not too hard. It’s similar to a <>. The main difference is that instead of having a `next` and `previous` links, we have an infinite number of linked nodes (children/descendants). .Tree's node constructor [source, javascript] @@ -26,11 +27,11 @@ include::{codedir}/data-structures/trees/tree-node.js[tag=snippet] Simple! Right? But there are some constraints that you have to keep at all times. .Tree data structures constraints -1. *Loops*: You have to be careful *not* to make a circular loop. Otherwise, this wouldn’t be a tree anymore but a <>! E.g., Node A has B as a child, then Node B list Node A as its descendant forming a loop. ‍️ -2. *Parents*: A node with more than two parents. Again, if that happens is no longer a tree but a <>. -3. *Root*: a tree must have only one root. Two non-connected parts are not a tree. <> can have non-connected portions and doesn’t have root. +1. *Loops*: You have to be careful *not* to make a circular loop. Otherwise, this wouldn’t be a tree anymore but a <>! E.g., Node A has B as a child, then Node B list Node A as its descendant forming a loop. ‍️ +2. *Parents*: A node with more than two parents. Again, if that happens is no longer a tree but a <>. +3. *Root*: a tree must have only one root. Two non-connected parts are not a tree. <> can have non-connected portions and doesn’t have root. -== Basic concepts +==== Basic concepts .Here’s a summary of the three basic concepts: * The topmost node is called *root*. @@ -49,30 +50,30 @@ Simple! Right? But there are some constraints that you have to keep at all times * The *depth of a tree* is the distance (edge count) from the root to the farthest leaf. .Tree anatomy -image:image31.jpg[image] +image::image31.jpg[image] -== Types of Binary Trees +==== Types of Binary Trees There are different kinds of trees depending on the restrictions. E.g. The trees that have two children or less are called *binary tree*, while trees with at most three children are called *Ternary Tree*. Since binary trees are most common we are going to cover them here and others in another chapter. -=== Binary Tree +===== Binary Tree (((Binary Tree))) (((Data Structures, Non-Linear, Binary Tree))) The binary restricts the nodes to have at most two children. Trees, in general, can have 3, 4, 23 or more, but not binary trees. .Binary tree has at most 2 children while non-binary trees can have more. -image:image32.png[image,width=321,height=193] +image::image32.png[image,width=321,height=193] Binary trees are one of the most used kinds of tree, and they are used to build other data structures. .Binary Tree Applications -- <> -- <> +- <> +- <> - Priority Queues -- <> +- <> - -=== Binary Search Tree (BST) +[[bst]] +===== Binary Search Tree (BST) (((Binary Search Tree))) (((Data Structures, Non-Linear, Binary Search Tree))) The Binary Search Tree (BST) is a specialization of the binary tree. BST has the same restriction as a binary tree; each node has at most two children. However, there’s another restriction: the values are ordered. It means the left child’s value has to be less or equal than the parent. In turn, the right child’s value has to be bigger than the parent. @@ -80,10 +81,10 @@ The Binary Search Tree (BST) is a specialization of the binary tree. BST has the > BST: left ≤ parent < right .BST or ordered binary tree vs. non-BST. -image:image33.png[image,width=348,height=189] +image::image33.png[image,width=348,height=189] -=== Binary Heap +===== Binary Heap (((Binary Heap))) (((Heap))) (((Max-Heap))) @@ -92,7 +93,7 @@ image:image33.png[image,width=348,height=189] The heap (max-heap) is a type of binary tree where the children's values are higher than the parent. Opposed to the BST, the left child doesn’t have to be smaller than the right child. .Heap vs BST -image:image34.png[image,width=325,height=176] +image::image34.png[image,width=325,height=176] The (max) heap has the maximum value in the root, while BST doesn’t. @@ -100,7 +101,7 @@ There are two kinds of heaps: min-heap and max-heap. For a *max-heap*, the root has the highest value. The heap guarantee that as you move away from the root, the values get smaller. The opposite is true for a *min-heap*. In a min-heap, the lowest value is at the root, and as you go down the lower to the descendants, they will keep increasing values. .Max-heap keeps the highest value at the top while min-heap keep the lowest at the root. -image:image35.png[image,width=258,height=169] +image::image35.png[image,width=258,height=169] .Heap vs. Binary Search Tree diff --git a/book/chapters/tree-search.adoc b/book/content/part03/tree-search-traversal.asc similarity index 84% rename from book/chapters/tree-search.adoc rename to book/content/part03/tree-search-traversal.asc index eb80efd2..418edaae 100644 --- a/book/chapters/tree-search.adoc +++ b/book/content/part03/tree-search-traversal.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Tree Search & Traversal +=== Tree Search & Traversal So far we covered, how to insert/delete/search values in a binary search tree (BST). However, not all binary trees are BST, so there are other ways to look for values or visit all nodes in a particular order. @@ -34,8 +34,8 @@ Why do we care? Well, there are specific problems that you can solve more optima Let's cover the Breadth-first search (BFS) and Depth-first search (DFS). -[Breadth First Search] -== Breadth-First Search for Binary Tree +[[bfs-tree]] +==== Breadth-First Search for Binary Tree (((BFS))) (((Breadth-First Search))) (((Tree, Breadth-First Search))) @@ -48,7 +48,7 @@ Let's how can we implement it! include::{codedir}/data-structures/trees/binary-search-tree.js[tag=bfs,indent=0] ---- -As you see, the BFS uses a <> data structure. We enqueue all the children of the current node and then dequeue them as we visit them. +As you see, the BFS uses a <> data structure. We enqueue all the children of the current node and then dequeue them as we visit them. Note the asterisk (`*`) in front of the function means that this function is a generator that yields values. (((JavaScript Notes, Generators))) @@ -88,8 +88,8 @@ console.log(Array.from(dummyIdMaker())); // [0, 1, 2] **** - -== Depth-First Search for Binary Tree +[[dfs-tree]] +==== Depth-First Search for Binary Tree (((DFS))) (((Depth-First Search))) (((Tree, Depth-First Search))) @@ -101,16 +101,16 @@ Depth-First search goes deep (depth) before going wide. It means that starting f include::{codedir}/data-structures/trees/binary-search-tree.js[tag=dfs,indent=0] ---- -This is an iterative implementation of a DFS using an <>. -It's almost identical to the BFS, but instead of using a <> we use a Stack. +This is an iterative implementation of a DFS using an <>. +It's almost identical to the BFS, but instead of using a <> we use a Stack. We can also implement it as recursive functions are we are going to see in the <> section. -== Depth-First Search vs. Breadth-First Search +==== Depth-First Search vs. Breadth-First Search We can see visually the difference between how the DFS and BFS search for nodes: .Depth-First Search vs. Breadth-First Search -image:depth-first-search-dfs-breadth-first-search-bfs.jpg[] +image::depth-first-search-dfs-breadth-first-search-bfs.jpg[] As you can see the DFS in two iterations is already at one of the farthest nodes from the root while BFS search nearby nodes first. @@ -119,9 +119,3 @@ As you can see the DFS in two iterations is already at one of the farthest nodes .Use BFS when: - The node you are looking for is *nearby* the root. - -:leveloffset: +1 -<<< -include::tree-binary-tree-traversal.adoc[] - -:leveloffset: -1 diff --git a/book/chapters/map-treemap.adoc b/book/content/part03/treemap.asc similarity index 94% rename from book/chapters/map-treemap.adoc rename to book/content/part03/treemap.asc index d862689f..61e91436 100644 --- a/book/chapters/map-treemap.adoc +++ b/book/content/part03/treemap.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= TreeMap +[[treemap]] +==== TreeMap (((TreeMap))) (((Data Structures, Non-Linear, TreeMap))) A TreeMap is a Map implementation using Binary Search Trees. @@ -35,7 +36,7 @@ class TreeMap { } ---- -== Inserting values into a TreeMap +===== Inserting values into a TreeMap For inserting a value on a TreeMap, we first need to inialize the tree: @@ -57,7 +58,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=set, indent=0] Adding values is very easy (once we have the underlying tree implementation). -== Getting values out of a TreeMap +===== Getting values out of a TreeMap When We search by key in a tree map, it takes *O(log n)*. This is the implementation: @@ -81,7 +82,7 @@ include::{codedir}/data-structures/maps/tree-maps/tree-map.js[tag=iterators, ind Generators are useful for producing values that can you can iterate in a `for...of` loop. Generators use the `function*` syntax which expects to have a `yield` with a value. **** -== Deleting values from a TreeMap +===== Deleting values from a TreeMap Removing elements from TreeMap is simple. diff --git a/book/chapters/algorithmic-toolbox.adoc b/book/content/part04/algorithmic-toolbox.asc similarity index 90% rename from book/chapters/algorithmic-toolbox.adoc rename to book/content/part04/algorithmic-toolbox.asc index b9041c5a..467d5180 100644 --- a/book/chapters/algorithmic-toolbox.adoc +++ b/book/content/part04/algorithmic-toolbox.asc @@ -1,4 +1,10 @@ -= Algorithmic Toolbox +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +[[algorithms-toolbox]] +=== Algorithmic Toolbox Have you ever given a programming problem and freeze without knowing where to start? Well, in this section we are going to give some tips, so you don't get stuck while coding. @@ -17,7 +23,7 @@ TIP: TL;DR: Don't start coding right away. First, solve the problem, then write .. If anything else fails, how would you solve it the dumbest way possible (brute force). We can optimize it later. . *Test* your algorithm idea with multiple examples . *Optimize* the solution –Only optimize when you have something working don't try to do both at the same time! -.. Can you trade-off space for speed? Use a <> to speed up results! +.. Can you trade-off space for speed? Use a <> to speed up results! .. Do you have a bunch of recursive and overlapping problems? Try <>. .. Re-read requirements and see if you can take advantage of anything. E.g. is the array sorted? . *Write Code*, yes, now you can code. diff --git a/book/chapters/backtracking.adoc b/book/content/part04/backtracking.asc similarity index 93% rename from book/chapters/backtracking.adoc rename to book/content/part04/backtracking.asc index ee58db8a..7faaf9f1 100644 --- a/book/chapters/backtracking.adoc +++ b/book/content/part04/backtracking.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Backtracking +=== Backtracking (((Backtracking))) (((Algorithmic Techniques, Backtracking))) Backtracking algorithms are used to find *all (or some)* solutions that satisfy a constraint. @@ -15,7 +15,7 @@ it stops and steps back (backtracks) to try another alternative. Some examples that use backtracking is a solving Sudoku/crosswords puzzle, and graph operations. ifndef::backend-pdf[] -image:Sudoku_solved_by_bactracking.gif[] +image::Sudoku_solved_by_bactracking.gif[] endif::backend-pdf[] Listing all possible solutions might sound like a brute force. @@ -30,7 +30,7 @@ It stops evaluating a path as soon as some of the conditions are broken and move However, it can only be applied if a quick test can be run to tell if a candidate will contribute to a valid solution. **** -== How to develop backtracking algorithms? +==== How to develop backtracking algorithms? Backtracking algorithms can be tricky to get right or reason about, but we are going to follow this recipe to make it easier. @@ -45,7 +45,7 @@ Let's do an exercise to explain better how backtracking works. // https://leetcode.com/problems/combination-sum/description/ -== Permutations +==== Permutations (((Permutations))) (((Words permutations))) > Return all the permutations (without repetitions) of a word. @@ -63,7 +63,7 @@ For instace, if you are given the word `art` these are the possible permutations Now, let's implement the program to generate all permutations of a word. -NOTE: We already solved this problem using an <>, now let's do it using backtracking. +NOTE: We already solved this problem using an <>, now let's do it using backtracking. .Word permutations using backtracking [source, javascript] @@ -80,7 +80,7 @@ As you can see, we iterate through each element and swap with the following lett In the following tree, you can visualize how the backtracking algorithm is swapping the letters. We are taking the `art` as an example. -[graphviz, Words Permutations, svg] +[graphviz, Words-Permutations, png] .... digraph g { node [shape = record,height=.1]; diff --git a/book/chapters/bubble-sort.adoc b/book/content/part04/bubble-sort.asc similarity index 85% rename from book/chapters/bubble-sort.adoc rename to book/content/part04/bubble-sort.asc index 007dda7a..f49ddac3 100644 --- a/book/chapters/bubble-sort.adoc +++ b/book/content/part04/bubble-sort.asc @@ -1,9 +1,9 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Bubble Sort +==== Bubble Sort (((Bubble Sort))) (((Sorting, Bubble Sort))) (((Sinking Sort))) @@ -15,7 +15,7 @@ However, if the array is entirely out of order, it will require _O(n^2^)_ to sor (((Quadratic))) (((Runtime, Quadratic))) -== Bubble Sort Implementation +===== Bubble Sort Implementation .Bubble Sort implementation in JavaScript [source, javascript] @@ -66,15 +66,15 @@ console.log(b); //️↪️ 1 Without the destructuring assignment, swapping two values requires a temporary variable. **** -Bubble sort has a <> running time, as you might infer from the nested for-loop. +Bubble sort has a <> running time, as you might infer from the nested for-loop. -== Bubble Sort Properties +===== Bubble Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes, _O(n)_ when already sorted -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ indexterm:[Runtime, Quadratic] diff --git a/book/chapters/divide-and-conquer-fibonacci.adoc b/book/content/part04/divide-and-conquer.asc similarity index 61% rename from book/chapters/divide-and-conquer-fibonacci.adoc rename to book/content/part04/divide-and-conquer.asc index 07d99a3a..be80b106 100644 --- a/book/chapters/divide-and-conquer-fibonacci.adoc +++ b/book/content/part04/divide-and-conquer.asc @@ -1,9 +1,31 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Recursive Fibonacci Numbers +=== Divide and Conquer + +(((Divide and Conquer))) +(((Algorithmic Techniques, Divide and Conquer))) +Divide and conquer is a strategy for solving algorithmic problems. +It splits the input into manageable parts recursively and finally joins solved pieces to form the solution. + +We have already implemented some algorithms using the divide and conquer technique. + +.Examples of divide and conquer algorithms: +- <>: *divides* the input into pairs, sort them, and them *join* all the pieces in ascending order. +- <>: *splits* the data by a random number called "pivot", then move everything smaller than the pivot to the left and anything more significant to the right. Repeat the process on the left and right side. Note: since this works in place doesn't need a "join" part. +- <>: find a value in a sorted collection by *splitting* the data in half until it sees the value. +- <>: *Take out* the first element from the input and solve permutation for the remainder of the data recursively, then *join* results and append the items that were taken out. + +.In general, the divide and conquer algorithms have the following pattern: +1. *Divide* data into subproblems. +2. *Conquer* each subproblem. +3. *Combine* results. + +As you might know, there are multiple ways to solve a problem. Let's solve the Fibonacci numbers using a divide and conquer algorithm. Later we are going to provide a more performant solution using dynamic programming. + +==== Recursive Fibonacci Numbers (((Fibonacci))) To illustrate how we can solve a problem using divide and conquer, let's write a program to find the n-th Fibonacci number. @@ -32,7 +54,7 @@ The implementation above does the job, but what's the runtime? For that, let's take a look at the job performed calculating the `fib(5)` number. Since `fib(5) = fib(4) + fib(3)`, we need to find the answer for `fib(4)` and `fib(3)`. We do that recursively until we reach the base cases of `fib(1)` and `fib(0)`. If we represent the calls in a tree, we would have the following: // http://bit.ly/2UmwzZV -[graphviz, Recursive Fibonacci call tree, png] +[graphviz, recursive-fibonacci-call-tree, png] .... graph G { "fib(5)" -- { "fib(4)", "fib(3)" } @@ -70,3 +92,5 @@ In the call tree, you can notice that every element in red and with asterisks `* Those who cannot remember the past are condemned to repeat it. For these cases when subproblems repeat themselves, we can optimize them using <>. Let's do that in the next section. + + diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc new file mode 100644 index 00000000..411c6f45 --- /dev/null +++ b/book/content/part04/dynamic-programming.asc @@ -0,0 +1,62 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Dynamic Programming + +(((Dynamic Programming))) +(((Algorithmic Techniques, Dynamic Programming))) +Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. + +// https://twitter.com/amejiarosario/status/1103050924933726208 +// https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson +// https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 +// https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem + +.How to explain dynamic programming to kids? 👶 +**** + +$$*$$*_Write down 1+1+1+1+1+1+1+1+1+1_*$$*$$ + +--{sp} What's that equal to? + +--{sp} $$*$$*_Kid counting one by one_*$$*$$ Ten! + +--{sp} Add another "+1". What's the total now? + +--{sp} $$*$$*_Quickly_*$$*$$ Eleven! + +--{sp} Why you get the result so quickly? Ah, you got it faster by adding one to the memorized previous answer. So Dynamic Programming is a fancy way of saying: "remembering past solutions to save time later." +**** + +==== Fibonacci Sequence with Dynamic Programming +(((Fibonacci))) +Let's solve the same Fibonacci problem but this time with dynamic programming. + +When we have recursive functions doing duplicated work is the perfect place for a dynamic programming optimization. We can save (or cache) the results of previous operations and speed up future computations. + +.Recursive Fibonacci Implemenation using Dynamic Programming +[source, javascript] +---- +include::{codedir}/algorithms/fibanacci-dynamic-programming.js[tag=snippet,indent=0] +---- + +This implementation checks if we already calculated the value, if so it will save it for later use. + +[graphviz, Recursive-Fibonacci-call-tree-with-dp, png] +.... +graph G { + "fib(5)" -- { "fib(4)" } + "fib(4)" -- { "fib(3)" } + "fib(3)" -- { "fib(2)" } + "fib(2)" -- { "fib(1)", "fib(0)" } +} +.... + +This graph looks pretty linear now. It's runtime _O(n)_! +(((Linear))) +(((Runtime, Linear))) + +(((Memoization))) +TIP: Saving previous results for later is a technique called "memoization". This is very common to optimize recursive algorithms with overlapping subproblems. It can make exponential algorithms linear! diff --git a/book/content/part04/greedy-algorithms.asc b/book/content/part04/greedy-algorithms.asc new file mode 100644 index 00000000..c28abd6e --- /dev/null +++ b/book/content/part04/greedy-algorithms.asc @@ -0,0 +1,105 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Greedy Algorithms + +(((Greedy Algorithms))) +(((Algorithmic Techniques, Greedy Algorithms))) +Greedy algorithms are designed to find a solution by going one step at a time and using heuristics to determine the best choice. +They are quick but not always lead to most optimum results since it might not take into consideration all the options to give a solution. + +An excellent example of a greedy algorithm that doesn't work well is finding the largest sum on a tree. + +[graphviz, Find-the-largest-sum, png] +.... +graph G { + 5 -- 3 [color="#B8E986", penwidth=2] + 5 -- 7 [color="#FF5252", penwidth=2] + 3 -- 87 [color="#B8E986", penwidth=2] + 3 -- 1 + 7 -- 2 + 7 -- 4 [color="#FF5252", penwidth=2] + + label="Optimal vs. Greedy path" +} +.... + +Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. + +Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. + +[TIP] +======= +Greedy algorithms make the choice that looks best at the moment based on a heuristic such as smallest, largest, best ratio, and so on. +This algorithm only gives one shot at finding the solution and never goes back to consider other options. +======= + +Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. + +.Some examples of greedy algorithms that works well: +- <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. +- <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. +indexterm:[Merge Sort] + + +.In general, we can follow these steps to design Greedy Algorithms: +1. Take a sample from the input data (usually in a data structure like array/list, tree, graph). +2. Greedy choice: use a heuristic function that will choose the best candidate. E.g., Largest/smallest number, best ratio, etc. +3. Reduce the processed input and repeat step #1 and #2 until all data is gone. +4. Return solution. +5. Check correctness with different examples and edge cases. + +==== Fractional Knapsack Problem + +We are going to use the "Fractional Knapsack Problem" to learn how to design greedy algorithms. The problem is the following: + +> You are going to resell legumes (rice, beans, chickpeas, lentils) and you only brought a knapsack. What proportion of items can you choose to get the highest loot without exceeding the maximum weight of the bag? + +Let's say we have the following items available. + +.Knpasack Input +[source, javascript] +---- +const items = [ + { value: 1, weight: 1}, + { value: 4, weight: 3 }, + { value: 5, weight: 4 }, + { value: 7, weight: 5 }, +]; + +const maxWeight = 7; +---- + +So, we have four items that we can choose from. We can't take them all because the total weight is `13` and the maximum we can carry is `7`. We can't just take the first one because with value `1` because it is not the best profit. + +How would you solve this problem? + +First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: + +- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. + +- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# + +- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# + +.Items value/weight ratio +---- + { value: 1, weight: 1 }, // 1/1 = 1 + { value: 4, weight: 3 }, // 4/3 = 1.33 ✅ + { value: 5, weight: 4 }, // 5/4 = 1.25 + { value: 7, weight: 5 }, // 7/5 = 1.4 ✅ +---- + +Let's implement this algorithm! + +.Factional Knapsack Problem Implementation +[source, javascript] +---- +include::{codedir}/algorithms/knapsack-fractional.js[tag=snippet,indent=0] +---- + +What's the runtime of this algorithm? + +We have to sort the array based on value/weight ratio. Sorting runtime is O(n log n). The rest is linear operations, so we the answer is _O(n log n)_ for our greedy algorithm. diff --git a/book/chapters/insertion-sort.adoc b/book/content/part04/insertion-sort.asc similarity index 81% rename from book/chapters/insertion-sort.adoc rename to book/content/part04/insertion-sort.asc index c44c4c5e..c8bc818d 100644 --- a/book/chapters/insertion-sort.adoc +++ b/book/content/part04/insertion-sort.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Insertion Sort +[[insertion-sort]] +==== Insertion Sort (((Sorting, Insertion Sort))) (((Insertion Sort))) @@ -11,7 +12,7 @@ Insertion sort is a simple sorting algorithm. It is one of the most natural ways // Good illustration on of sorting a deck of cards: https://www.khanacademy.org/computing/computer-science/algorithms/insertion-sort/a/insertion-sort -== Insertion Sort Implementation +===== Insertion Sort Implementation Insertion sort does the following: It starts from the 2nd element, and it tries to find anything to the left that could be bigger than the current item. It will swap all the elements with higher value @@ -28,14 +29,14 @@ include::{codedir}/algorithms/sorting/insertion-sort.js[tag=sort, indent=0] <4> We check every element on the left side and swap any of them that are out of order -== Insertion Sort Properties +===== Insertion Sort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#✅# Yes -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ (((Quadratic))) (((Runtime, Quadratic))) diff --git a/book/chapters/merge-sort.adoc b/book/content/part04/merge-sort.asc similarity index 82% rename from book/chapters/merge-sort.adoc rename to book/content/part04/merge-sort.asc index 91cb45b0..65e90f0d 100644 --- a/book/chapters/merge-sort.adoc +++ b/book/content/part04/merge-sort.asc @@ -1,19 +1,22 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Merge Sort +[[merge-sort]] +==== Merge Sort + (((Sorting, Merge Sort))) (((Merge Sort))) + Merge Sort is an efficient sorting algorithm that uses <> paradigm to accomplish its task faster. However, It uses auxiliary memory in the process of sorting. indexterm:[Divide and Conquer] Merge sort algorithm splits the array into halves until 2 or fewer elements are left. It sorts these two elements and then merges back all halves until the whole collection is sorted. -image:image11.png[Mergesort visualization,width=500,height=600] +image::image11.png[Mergesort visualization,width=500,height=600] -== Merge Sort Implementation +===== Merge Sort Implementation .Merge Sort implementation in JavaScript (mergeSort) [source, javascript] @@ -44,17 +47,17 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge, indent=0] <2> If `array1` current element (`i1`) has the lowest value, we insert it into the `mergedArray` if not we then insert `array2` element. <3> `mergedArray` is `array1` and `array2` combined in ascending order (sorted). -Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. +Merge sort has an _O(n log n)_ running time. For more details about how to extract the runtime go to <> section. -== Merge Sort Properties +===== Merge Sort Properties - <>: [big]#✅# Yes - <>: [big]#️❌# No, it requires auxiliary memory O(n). - <>: [big]#️❌# No, new elements will require to sort the whole array. - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - Recursive: Yes -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory +- Time Complexity: [big]#✅# <> _O(n log n)_ +- Space Complexity: [big]#⚠️# <> _O(n)_, use auxiliary memory (((Linearithmic))) (((Runtime, Linearithmic))) diff --git a/book/chapters/quick-sort.adoc b/book/content/part04/quick-sort.asc similarity index 88% rename from book/chapters/quick-sort.adoc rename to book/content/part04/quick-sort.asc index b3bd1d3e..a2d0e32d 100644 --- a/book/chapters/quick-sort.adoc +++ b/book/content/part04/quick-sort.asc @@ -1,19 +1,20 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Quicksort +[[quicksort]] +==== Quicksort (((Sorting, QuickSort))) (((QuickSort))) Quicksort is an efficient recursive sorting algorithm that uses <> paradigm to sort faster. It can be implemented in-place, so it doesn't require additional memory. indexterm:[Divide and Conquer] -In practice, quicksort outperforms other sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. +In practice, quicksort outperforms other sorting algorithms like <>. And, of course, It also outperforms simple sorting algorithms like <>, <> and <>. Quicksort picks a "pivot" element (preferably random) and move all the parts that are smaller than the pivot to the right and the ones that are bigger to the left. It does this recursively until all the array is sorted. -== Quicksort Implementation +===== Quicksort Implementation Quicksort implementation uses the divide-and-conquer in the following way: @@ -72,17 +73,17 @@ And you can see the implementation of `shuffle` below: include::{codedir}/algorithms/sorting/sorting-common.js[tag=shuffle, indent=0] ---- -With the optimization, Quicksort has an _O(n log n)_ running time. Similar to the merge sort we divide the array into halves each time. For more details about how to extract the runtime go to <>. +With the optimization, Quicksort has an _O(n log n)_ running time. Similar to the merge sort we divide the array into halves each time. For more details about how to extract the runtime go to <>. -== Quicksort Properties +===== Quicksort Properties - <>: [big]#✅# Yes - <>: [big]#✅# Yes - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - <>: [big]#️❌# No, the pivot element can be choose at random. - Recursive: Yes -- Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#✅# <> _O(n log n)_ +- Space Complexity: [big]#✅# <> _O(1)_ (((Linearithmic))) (((Runtime, Linearithmic))) diff --git a/book/chapters/selection-sort.adoc b/book/content/part04/selection-sort.asc similarity index 78% rename from book/chapters/selection-sort.adoc rename to book/content/part04/selection-sort.asc index 1272254a..f4787e05 100644 --- a/book/chapters/selection-sort.adoc +++ b/book/content/part04/selection-sort.asc @@ -1,9 +1,10 @@ ifndef::imagesdir[] -:imagesdir: ../images -:codedir: ../../src +:imagesdir: ../../ +:codedir: ../../../src endif::[] -= Selection Sort +[[selection-sort]] +==== Selection Sort (((Sorting, Selection Sort))) (((Selection Sort))) @@ -14,9 +15,9 @@ The selection sort is a simple sorting algorithm. As its name indicates, it _sel . Find the minimum item in the rest of the array. If a new minimum is found swap them. . Repeat step #1 and #2 with the next element until the last one. -image:selection-sort.gif[] +image::selection-sort.gif[] -== Selection sort implementation +===== Selection sort implementation For implementing the selection sort, we need two indexes. .Selection sort @@ -35,14 +36,14 @@ TIP: Selection sort minimizes the number of swaps. It does one swap per iteratio One index is for the position in question (selection/left) and another one for finding the minimum in the rest of the array (right). -== Selection Sort Properties +===== Selection Sort Properties - <>: [big]#✅# Yes - <>: [big]#️️❌# No - <>: [big]#️️❌# No - <>: [big]#️️❌# No -- Time Complexity: [big]#⛔️# <> _O(n^2^)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Time Complexity: [big]#⛔️# <> _O(n^2^)_ +- Space Complexity: [big]#✅# <> _O(1)_ *Why selection sort is not stable?* @@ -54,7 +55,7 @@ Initially, we select the first element `2a` and check if there's anything less t Now, we have: `1, 5, 2b, 2a`. There you have it, `2b` now comes before `2a`. -// CAUTION: In practice, selection sort performance is the worst compared <> and <>. The only advantage of selection sort is that it minimizes the number of swaps. In case, that swapping is expensive, then it could make sense to use this one over the others. +// CAUTION: In practice, selection sort performance is the worst compared <> and <>. The only advantage of selection sort is that it minimizes the number of swaps. In case, that swapping is expensive, then it could make sense to use this one over the others. (((Quadratic))) (((Runtime, Quadratic))) diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc new file mode 100644 index 00000000..878029ab --- /dev/null +++ b/book/content/part04/sorting-algorithms.asc @@ -0,0 +1,142 @@ +ifndef::imagesdir[] +:imagesdir: ../../ +:codedir: ../../../src +endif::[] + +=== Sorting Algorithms + +Sorting is one of the most common solutions when we want to extract some insights about a collection of data. +We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. + +.We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: +- <> +- <> +- <> + +.and then discuss efficient sorting algorithms _O(n log n)_ such as: +- <> +- <> + +Before we dive into the most well-known sorting algorithms, let's discuss the sorting properties. + +==== Sorting Properties + +Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. + +Sorting properties are stable, adaptive, online and in-place. Let's go one by one. + +===== Stable +(((Sorting, stable))) +An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. + +This especially useful when you want to sort on multiple phases. + +.Let's say you have the following data: +[source, javascript] +---- +const users = [ + { name: 'Bob', age: 32 }, + { name: 'Alice', age: 30 }, + { name: 'Don', age: 30 }, + { name: 'Charly', age: 32 }, +]; +---- + +.If you sort by `name` you would have: +[source, javascript] +---- +[ + { name: 'Alice', age: 30 }, + { name: 'Bob', age: 32 }, + { name: 'Charly', age: 32 }, + { name: 'Don', age: 30 }, +]; +---- + +Then, here comes the _critical_ part, if you sort by `age` you might get (at least two) different results. + +.If the sorting algorithm is *stable*; it should keep the items with the same age ordered by `name`: +[source, javascript] +---- +[ + { name: 'Alice', age: 30 }, + { name: 'Don', age: 30 }, + { name: 'Bob', age: 32 }, + { name: 'Charly', age: 32 }, +]; +---- + +.However, if the sorting is *not stable*, then you will lose the relative order of the items and get something like this: +[source, javascript] +---- +[ + { name: 'Don', age: 30 }, + { name: 'Alice', age: 30 }, + { name: 'Charly', age: 32 }, + { name: 'Bob', age: 32 }, +]; +---- + +Both results are sorted by `age`; however, having a stable sorting is better if you want to keep the relative position of data with the same value. + +===== In-place +(((Sorting, in-place))) +An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. +No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. + +===== Online +(((Sorting, online))) +It can sort a list as it receives it. +((Online sorting)) algorithms don't have to re-sort the whole collection for every new item added. + +===== Adaptive +(((Sorting, adaptive))) +Algorithms with ((adaptive sorting)) run faster, close to _O(n)_, on an already sorted (or partially sorted) collection. + +<<< +include::bubble-sort.asc[] + +<<< +include::insertion-sort.asc[] + +<<< +include::selection-sort.asc[] + +<<< +include::merge-sort.asc[] + +<<< +include::quick-sort.asc[] + +<<< +==== Summary + +We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. +(((Tables, Algorithms, Sorting Complexities))) +(((Tables, Algorithms, Sorting Summary))) + +// tag::table[] +.Sorting algorithms comparison +[cols="20,80"] +|=== +| Algorithms | Comments +| <> | Swap pairs bubbling up largest numbers to the right +| <> | Look for biggest number to the left and swap it with current +| <> | Iterate array looking for smallest value to the right +| <> | Split numbers in pairs, sort pairs and join them in ascending order +| <> | Choose a pivot, set smaller values to the left and bigger to the right. +// | Tim sort | Hybrid of merge sort and insertion sort +|=== + +.Sorting algorithms time/space complexity and properties +|=== +| Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive +| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes +| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes +| <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No +| <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No +| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No +// | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes +|=== +// end::table[] + diff --git a/book/chapters/preface.adoc b/book/content/preface.asc similarity index 85% rename from book/chapters/preface.adoc rename to book/content/preface.asc index 86222879..7f983404 100644 --- a/book/chapters/preface.adoc +++ b/book/content/preface.asc @@ -1,26 +1,26 @@ [preface] -= Preface +== Preface -== What is in this book? +=== What is in this book? -_{book-title}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or looking for ideas to solve a problem optimally. (Check out the <

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

jBp5^;l!*u%y-n! zA7Kom^9+f$sdZ1j<6)2^&w&|_nFlBJ2VP+I*EAFmxE2k<)uo&&Jt*(T?~Sfu?gS|@ zU^BST8zi*?mhzb&NJclOP7SiF>B*vli{JJ|(UHq%jS}&C{ns8=+H1N)@$nDE|Wb=qHf5 zQp#NJWDCqv&1za0*!&IRKvKyHm>wBvdX-qgrO|_L$diFTzF`)*NhuP60YTgv_5NTb z3tW55<3GJvpPd1iK9Sqh9<}|n_5Na;?|F8Lr4|@020+H5<|4sfSxT(%(vHixe$eFR zyxbRNsM=;xO`}HMMh(2KAg0{|w;mWb`+mcSJVo4X3Col3e~({0tO!gox@*S~lAp_@ z+`#?D?8o!^&eaXQFd4+iubJ;khjQg_(Vf5$eE@tAQ(!!q!6%WcJzjo(s$%zc>^%GY;Wk?2u#g4u4`J{2&s%IjXHIZY|Q_VRp3+_ToutcE+? z#v;i!f}7bpPxTQs!X;Bq^{jj_r*xxD^ zrB$Bqk6V^UvcD4q{PG2LMCt(@crvzC>hl0wHweySGYICJQ_ww5UG2smk*zH4rf+`3 zTP7eZ=yB~?omkAtQ0@=lpWTp>JF5;lmYXupJv<|o#R4)7m5n&LPsu#X-^Zs0$z-uw zV#Tv#%#$QtW7gt#QG#*N;mAde>SGj^Q9l@`=I!f%wTNQiA6maIRQrmlz~XvbBnIQ{ z2lj^IZ)>5Ov8bNkWxkoMIS||QkhZqHrPpYPakBJOw``g`M6m!PH~t`z2JIMRBzLgL zrmsG_JKvjcZF%Wz4Rjc-CZBn}2_lEJ=9su+alJX=7Z`8VqK=k~LhMgGEU1^fx+2IV|I^gru`Q_}JZo-gx}qgXxnR*?9tI3IiWvHL#xSFzU5 zut;sLPnJf*#4D3uY?;#LN3TVezM!AP->tH*X$p6do!_eK`G16=YTRY-ebT&TqnX<1Zo%Ely<_`~Qhf)NeYI%2!;o+!zj)|i4nu=s(%BE5%WsT#1c_6Qn&vhIo_C*xj{aUE>E%UiV^E6 z7A{-N&Ie1Dvf5IH&pZgLIdTM5-xrxCn;!H^nPEPRB`sP5my3%17w!$b(W@1-4-y?+ zocp-U#vzQ7pH*p@-f5c+ghI>)<}Ke%qi#;S&cwc=AG=54TZn5%>7RafsES!D*^<;| z0-lE;Rl{h9(xSrD$$VlUt;0@PaCrF(u8pT zFj4;x4Gj2le*qq$RXhB3*5ZHDE#Yqx47>i?+PNEJu^|`ZB2bL7`U7!Xy@D$ z9`z$Z(YVcw42ow+i_8B}eb6@=9$J2O zAcS5P5G7VUz~8+{>sx1kq-VyaDtUg`hBmlb7>|>2%jbwnfh@(<*#<_B9~~)baed%C z&wJqgZ5p~iehw#)y!v-U6=c5o#wz7$Ab>LX)Yq0+NM~Bpq1V>C`Va?Zzu0sj&Cg-~ z=VWcjnW=MX*7~0LV99%-gfy|s56!;-7EG<+lpyT;J0MpBgVE_OC literal 0 HcmV?d00001 diff --git a/book/images/cover-a41.png b/book/images/cover-a41.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1b5d4d6760e82c1bc7676b37957dad6a0ae4cf GIT binary patch literal 51986 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

Z&eiEV<5oJLb^o7eq>fxxyQ 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�l3;0hIf6BUg1p7#1&2ulnCw`-!5)K_chz#*HQK;q74GB;Hk0dyIpoGcpQq2; z>!>!=8%QIrDG1DS?QygEB1K3;sn_au(x$~0yQbXe)C8SUn6XLc&uhCiE}qI}g>)px z7J{I+!l|=hz1TwU@t5H2{S~S7o?!tCNydn1-4-|!3Fs|Ty_4tIvF^-kL^xUzdDF53 z_BZa+wri!-$>crlU@Mz^-~6NIrvyRpWq&&)&-x12Icwqur8rL@A{Fr#LzKoa9A z7s)tEVjVT@pLTliM)j&>6kwOmHs~u~D^WpPply(kJc;x^^WUs&_d&MfF~kN!EJtV@ zIN3v<(QkLqJX{|WTr2O&Cja*Bnxj|at@#?f?PUcdK1-GhwIf42j$D|XK$z?+_V0lg zn&?KD4Yx{G;#jv`$&>-{~j!~n*->@g$u8lSW1peH^=2hWJ(T7*p z5-ZCT&Q2fOC0nrKQY<^qzs2XS(0w^6C|D5?t+tL#$g?my!j{n!>qYZyhjN2I;g;Wc`kYIeGGj{A zMuzw1=}KZh4&?`LR#DuFb>u~#-XugIz?L$$9j8soF|S;5^N+18-{@YI3W0pcPYfcqgZlR^w@gK=Zp)0lzu=&|aDih+(m&AO zJ9LFJ3s-9qq-+dfFf)MoR5~K?mtnSULmTf�-Ann~fCk5YX!%1mm#lz;B?8Dk1`$ zuPHQ;nBY+u<43oj-}2Csfx1#NN*qS_Ok07HbowIf)J2p#2iAn73X3|Maj&-o}=!kq6_Y3THoZc zp)zuf#yMnMdL*F)5Lr6jY+^Axc?=FJa6TJ+*w#xM&~HlA?#@CFhaL0%q4QoG#>ojm z3NmhsK=tRy>s?^#^2vLu7(SV^5p%K|9g|WoPCpyYOC+Eb&GpG-iyiEnf-Bhz1rAJ3 zTsBu}IM}9yhNQNT#@*rH48j0e*@L*soQY!G#Gqcz&_$my=!ujH#`~uq%4PW#KWs0cUhOz72b;?_p?A z0dz#RWz*N*51GvxK0{xz7X1dj%Qc^8B&#DPv+sAsW%V9QZX1+@4bFput7#BJd!peR z6jH<+PrDu@unH9P=%Clu?ps3dS$5Y_`*&q=CVjhRte+q6u6ewEbo4vzgf6N8aVfhp zvGws{v@c}&yy1horCs-voA&nSOXC#WrG^~;Lj*S)jXgvJ3f{G~)&0#BGyt{OXNf4q zg<)X!o8~C_*!TgF0yQ!n{Y|NB6oAHAV&0k)I>qO;KzXuuaw4B|C?z|GsVQ< z>J8yg4OUw_MUIHb;rEaWn46 z;n^gV6&AuCpHZjkHuy32PCr3vkPi9EGc`KXHB2GpLh1a-?ZfR++#ZzNX)Nd7P+V_Z3*C)&LwH1{eK1lXV$9m4?1|%aFkQNh=kFN z(>Qp9{jG2Ja6x%9AGBxmCS*l0RM&#iX#abEDnJct{e=qXPXeo`hJjbsBeQ+Tj^wny zOMyWA`u7|LP=|+wI*krn*o`6sQoRkAzR9NMv%_Buu`yoK>9@0COkzz>xEyt^D_@)fw7`!a5xVW|3NLP4ikY z7=(iMpT)8vWR29`=dv_@31-l>8~*U(Ebb8hugFqDV4%GZ1f*#@cn2DpR;F0y!7uF1 zEo3dy|E`+?RceFHG;9LU*A_nRIXUGKEXm5>g9d;$X+XDYHo>Cf35R5O&!4SB)Bn*G z@KX`a`zb%nR1rzDi5!G-Cx%+ z5O?nP-Dj1B^uM_X0)j`yeABJ2eKX>R(k2U;w8O zOs=7v|9(y-gJo&K`YiC@3ujW{J<-tgRKQndP976Z@Xh|kBqR=G{Ccq|6S9O|)XS<) zV?it-k$FD&Be>8;$dC4TQS|95VM>obkv!II3fSEZ3|b7i{on%2C6`)})^upCId=}) z7&n#pP-yo zH!dB$AOV>xxum!}@!roI--uLQ#t{56%~DWTA-a~DZFi7D_r0QVf#+s#%Hp>455rUb z!uiVihqx+_T_jDOTSxs4jGx3}`wciaVH*Lof4|-SFZNKleXFIu9 z2r_^8S~lBVUzYYgdx2-8mcilo8gTG)BU+^d99mZ0@2F#adlO11@;)&;yNa4J6TERLI+y}#XJ#Zz3$5B<}zkH7CWp-HxT zzK*^zvp*zy+^y%nN(Dak6-p9d(GY2Dw5+s~ezCuM6tW(2DM|vp&27 z*$Y_8T@xg>0_t%M_Du|kzMDxXT43#Lmvw?fZ9Ar2f{H!+^r^7{f)SX?%1ZjBWJ^Q% z$@03!`9G?S75e)6Ivr@Y7W=N3jZ;?@(}e}j#VvJ-E=ND^(TW7Ve_Hd1R1v(&VCXt# z+72o!brvg2#5k(T9GjNIvt{FOZK52t+G}@|wW35>8O+;fjNq+CGHqhMsd-WiIPB|Bvrk)proB z>|J8}5zU)!LOP#pPaPJUSovJ ziKNOkd3vebmbmL(=|rv8S?s!BE%pV=g*e|Cr99PLk|V4vWW z`U4;F@nE|LN1~4Ux6{3}TRV6p-fNS>Yt7?AnC94Vd$#WW!5)?!gm@;mrO)hl+^H&ylogVvH?|McS+iOtIKN_BtGk1C6_dc68z`Dhx* zE}LEYY_>44()9jQ_L@>*17A&k3~M)ZVS_#K{>$A1t8IQ|94Eve*rMl0bfIo@Re;BP zb~Rp?7WT;$OM=WkBDg@(ufOOy*M1PW!A`Ne@ob^)-%L%j?rC⁡Zrd-<1$wcCyQ6 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 fqKw$;`Q)^NFi*L0;g;H9 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 CDZHfs literal 104354 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 literal 0 HcmV?d00001 diff --git a/book/images/recursive-fibonacci-call-tree.png b/book/images/recursive-fibonacci-call-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..9e18a2ab7e050308393102aa9cc8922d5c0a7baf GIT binary patch literal 52743 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%0Dq?o%c)^!oBrA2&6E*^ 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 Yr8BcFzjC?92nGJhN-9c}i5d9*KL_kY%m4rY literal 0 HcmV?d00001 diff --git a/book/index.asc b/book/index.asc new file mode 100644 index 00000000..4312be40 --- /dev/null +++ b/book/index.asc @@ -0,0 +1,5 @@ +[index] +[[index]] +== Index + +ifndef::backend-pdf[Topical index only available on the PDF version.] diff --git a/book/lab/greetings.pdf b/book/lab/greetings.pdf deleted file mode 100644 index fab4624f7ebc4a8bea88e0c4462e851531aa98d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10630 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 M5_m8g&A!ax59Y)4;{X5v diff --git a/book/part01-algorithms-analysis.asc b/book/part01-algorithms-analysis.asc new file mode 100644 index 00000000..aefd21c1 --- /dev/null +++ b/book/part01-algorithms-analysis.asc @@ -0,0 +1,12 @@ +[[part01-algorithms-analysis]] +== Algorithms Analysis + +In this part, we are going to cover the basics of algorithms analysis. Also, we will discuss the most common runtimes of algorithms and provide a code example for each one. + +include::content/part01/algorithms-analysis.asc[] + +include::content/part01/big-o-examples.asc[] + +=== Summary + +Lorem ipsum dolor sit, amet consectetur adipisicing elit. Aut, optio harum. Rem assumenda iste est delectus quas corporis tenetur esse neque id officia expedita porro sit, totam rerum illo cupiditate. diff --git a/book/chapters/linear-data-structures-intro.adoc b/book/part02-linear-data-structures.asc similarity index 59% rename from book/chapters/linear-data-structures-intro.adoc rename to book/part02-linear-data-structures.asc index a9b5d3b3..ad0db79e 100644 --- a/book/chapters/linear-data-structures-intro.adoc +++ b/book/part02-linear-data-structures.asc @@ -1,16 +1,17 @@ -[partintro] --- +[[part02-linear-data-structures]] +== Linear Data Structures + Data Structures comes in many flavors. There’s no one to rule them all. You have to know the tradeoffs so you can choose the right one for the job. Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you how when to use over the other or even tweak them to create a new one. We are going to explore the most common data structures time and space complexity. .In this part we are going to learn about the following linear data structures: -- <> -- <> -- <> -- <> +- <> +- <> +- <> +- <> -Later, in the next part, we are going to explore non-linear data structures like <> and <>. +Later, in the next part, we are going to explore non-linear data structures like <> and <>. ifdef::backend-html5[] If you want to have a general overview of each one, take a look at the following interactive diagram: @@ -21,4 +22,18 @@ If you want to have a general overview of each one, take a look at the following +++ endif::[] --- +include::content/part02/array.asc[] + +<<< +include::content/part02/linked-list.asc[] + +<<< +include::content/part02/stack.asc[] + +<<< +include::content/part02/queue.asc[] + +<<< +include::content/part02/array-vs-list-vs-queue-vs-stack.asc[] + + diff --git a/book/part03-graph-data-structures.asc b/book/part03-graph-data-structures.asc new file mode 100644 index 00000000..baebfd0e --- /dev/null +++ b/book/part03-graph-data-structures.asc @@ -0,0 +1,38 @@ +[[part03-graph-data-structures]] +== Graph Data Structures + +Graph-based data structures are everywhere whether you realize it or not. You can find them in databases, Web (HTML DOM tree), search algorithms, finding the best route to get home and many more uses. We are going to learn the basic concepts and when to choose one over the other. + +.In this chapter we are going to learn: +- Exciting <> data structure applications +- Searching efficiently with a <> data structures. +- One of the most versatile data structure of all <>. +- Keeping dups out with a <>. +By the end of this section, you will know the data structures trade-offs and when to use one over the other. + +include::content/part03/tree-intro.asc[] + +<<< +include::content/part03/binary-search-tree.asc[] + +<<< +include::content/part03/tree-search-traversal.asc[] + +<<< +include::content/part03/binary-search-tree-traversal.asc[] + +<<< +include::content/part03/map.asc[] + +<<< +include::content/part03/set.asc[] + +<<< +include::content/part03/graph.asc[] + +<<< +include::content/part03/graph-search.asc[] + +<<< +include::content/part03/time-complexity-graph-data-structures.asc[] + diff --git a/book/chapters/algorithms-intro.adoc b/book/part04-algorithmic-toolbox.asc similarity index 73% rename from book/chapters/algorithms-intro.adoc rename to book/part04-algorithmic-toolbox.asc index d44ad6e6..81e4f476 100644 --- a/book/chapters/algorithms-intro.adoc +++ b/book/part04-algorithmic-toolbox.asc @@ -1,3 +1,6 @@ +[[part04-algorithmic-toolbox]] +== Algorithmic Toolbox + In this part of the book, we are going to cover examples of classical algorithms in more details. Also, we will provide algorithmic tools for improving your problem-solving skills. @@ -5,7 +8,7 @@ IMPORTANT: There's not a single approach to solve all problems but knowing well- We are going to start with <> // and searching algorithms, -such as <>, <> and some others. +such as <>, <> and some others. Later, you are going to learn some algorithmic paradigms that will help you to identify common patterns and solve problems from different angles. @@ -15,3 +18,22 @@ Later, you are going to learn some algorithmic paradigms that will help you to i - <>: _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. - <>: search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). + + +include::content/part04/sorting-algorithms.asc[] + +<<< +include::content/part04/divide-and-conquer.asc[] + +<<< +include::content/part04/dynamic-programming.asc[] + +<<< +include::content/part04/greedy-algorithms.asc[] + +<<< +include::content/part04/backtracking.asc[] + +<<< +include::content/part04/algorithmic-toolbox.asc[] + diff --git a/book/sample-o.adoc b/book/sample-o.adoc deleted file mode 100644 index 983c90fa..00000000 --- a/book/sample-o.adoc +++ /dev/null @@ -1,47 +0,0 @@ -include::_conf/variables.adoc[] - -= {doctitle} - -// remove numbering from titles, and sub-titles e.g. 1.1 -:sectnums!: - -// Copyright © 2018 Adrian Mejia (g) -include::chapters/colophon.adoc[] - -// Abstract and Dedication MUST have a level-0 heading in EPUB and Kindle -// but level-1 in PDF and HTML -// ifndef::backend-epub3[:leveloffset: +1] -// include::chapters/dedication.adoc[] -// ifndef::backend-epub3[:leveloffset: -1] -include::chapters/dedication.adoc[] - -// (g) -include::chapters/preface.adoc[] - -// add sections to chapters -:sectnums: - - -//----------------------------------- -// TODO: commment out sample on final -//----------------------------------- - -include::chapters/sample.adoc[] - -//----------------------------------- -// TODO: end remove ------ -//----------------------------------- - - -// --- end algorithms --- - - -// -// end chapters -// -:sectnums!: - -include::chapters/epigraph.adoc[] - -[index] -= Index diff --git a/book/sample.adoc b/book/sample.adoc deleted file mode 100644 index cda039b7..00000000 --- a/book/sample.adoc +++ /dev/null @@ -1,70 +0,0 @@ -= Data Structures and Algorithms Explained in JavaScript -:book-title: {doctitle} -:author: Adrian Mejia -:email: hello+dsajs@adrianmejia.com -:revnumber: 1.0.0 -:revdate: {docdate} -:revyear: 2019 -:revremark: First Edition -:subject: Algorithms -:keywords: Algorithms, Data Structures, JavaScript, Coding Interviews, Computer Science, Time Complexity, Linked Lists, Graphs, Binary Search Trees -:doctype: book -:media: screen -:imagesdir: {docdir}/images -ifeval::["{media}" != "prepress"] -:front-cover-image: image:cover.png[Front Cover,1050,2600] -endif::[] -:toc: -:toclevels: 3 -:icons: font -:lang: en -:language: javascript -:experimental: -:pdf-fontsdir: ./fonts -:pdf-stylesdir: ./_resources/pdfstyles -:pdf-style: adrian-screen -:title-logo-image: image:logo.png[Logo,50,50] - -// custom variables -:codedir: ../../src -:datadir: {docdir}/data -:source-highlighter: pygments -:pygments-style: xcode - - -ifndef::ebook-format[:leveloffset: 1] - -[colophon#colophon%nonfacing] -include::chapters/colophon.adoc[] - -[dedication] -include::chapters/dedication.adoc[] - -// [%nonfacing] -// include::chapters/acknowledgements.adoc[] - -[preface] -include::chapters/preface.adoc[] - -// include::chapters/introduction.adoc[] - -include::chapters/chapter1.adoc[] - -include::chapters/sample.adoc[] - -// include::chapters/chapter2.adoc[] - -// include::chapters/chapter3.adoc[] - -// include::chapters/chapter4.adoc[] - -include::chapters/appendix.adoc[] - -// include::chapters/epigraph.adoc[] - -// include::chapters/about.adoc[] - -ifdef::backend-pdf,backend-docbook[] -[index] -= Index -endif::[] diff --git a/deprecated-README.adoc b/deprecated-README.adoc index 7c8d8136..f0ff9d83 100644 --- a/deprecated-README.adoc +++ b/deprecated-README.adoc @@ -3,8 +3,8 @@ :toclevels: 2 Adrian Mejia -image:https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] -image:https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] +image::https://travis-ci.com/amejiarosario/dsa.js.svg?branch=master["Build Status", link="https://travis-ci.com/amejiarosario/dsa.js"] +image::https://badge.fury.io/js/dsa.js.svg["npm version", link="https://badge.fury.io/js/dsa.js"] This repository covers the implementation of the classical algorithms and data structures in JavaScript. @@ -18,12 +18,12 @@ toc::[] - Algorithm analysis fundamentals (Big O notation, Time/Space complexity) and examples. - Time/space complexity cheatsheet. -image:book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] +image::book/cover.png[link=https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/, height=400] == Data Structures We are covering the following data structures. -image:https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] +image::https://user-images.githubusercontent.com/418605/46118890-ba721180-c1d6-11e8-82bc-6a671428b422.png[link=https://embed.kumu.io/85f1a4de5fb8430a10a1bf9c5118e015] ### Linear Data Structures 1. **Arrays**: Built-in in most languages so not implemented here. https://adrianmejia.com/blog/2018/04/28/data-structures-time-complexity-for-beginners-arrays-hashmaps-linked-lists-stacks-queues-tutorial/#Array[Post]. diff --git a/package-lock.json b/package-lock.json index 109eacb4..d285e8d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.2.3", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -887,14 +887,12 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "fill-range": "^7.0.1" } }, "browser-process-hrtime": { @@ -1133,9 +1131,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, @@ -1743,9 +1741,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -1824,6 +1822,30 @@ "dev": true, "requires": { "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "expect": { @@ -1956,16 +1978,23 @@ } }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "to-regex-range": "^5.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "find-up": { @@ -2056,7 +2085,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2077,12 +2107,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2097,17 +2129,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2224,7 +2259,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2236,6 +2272,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2250,6 +2287,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2257,12 +2295,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2281,6 +2321,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2361,7 +2402,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2373,6 +2415,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2458,7 +2501,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2494,6 +2538,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2513,6 +2558,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2556,12 +2602,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2670,12 +2718,12 @@ "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" @@ -3049,13 +3097,10 @@ } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-path-cwd": { "version": "1.0.0", @@ -3715,9 +3760,9 @@ "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3938,9 +3983,9 @@ } }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "mem": { @@ -3986,6 +4031,19 @@ "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + } } }, "mime-db": { @@ -4118,6 +4176,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4652,9 +4716,9 @@ "dev": true }, "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -5872,13 +5936,13 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { diff --git a/package.json b/package.json index be0d9469..ef2c1365 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.2.3", + "version": "1.3.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -31,11 +31,17 @@ "dependencies": {}, "devDependencies": { "benchmark": "2.1.4", + "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", + "jest": "23.6.0", + "braces": ">=2.3.1", + "handlebars": ">=4.0.14", + "js-yaml": ">=3.13.1", + "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { From df281eb2089e67b5166bb483995b65c1bb0caa8e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 07:12:32 -0400 Subject: [PATCH 004/200] docs(readme): make links relative --- README.md | 146 +++++++++++++++++++++++++++--------------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 1d399c45..9f40cc4e 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ and then you can import it into your programs or CLI const { LinkedList, Queue, Stack } = require('dsa.js'); ``` -For a full list of all the exposed data structures and algorithms [see](https://github.com/amejiarosario/dsa.js/blob/master/src/index.js). +For a full list of all the exposed data structures and algorithms [see](src/index.js). ## Features @@ -89,7 +89,7 @@ This material is going to teach you to: ## What's Inside -All the code and explanations are available on this repo. You can dig through the links and code examples from the ([src folder](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/tree/master/src)). However, the inline code examples are not expanded (because of Github's asciidoc limitations) but you can follow the path and see the implementation. +All the code and explanations are available on this repo. You can dig through the links and code examples from the ([src folder](src)). However, the inline code examples are not expanded (because of Github's asciidoc limitations) but you can follow the path and see the implementation. _Note: If you prefer to consume the information in a more linear fashion then the [book format](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) would be more appropriate for you._ @@ -97,7 +97,7 @@ The topics are divided in 4 main categories as you can see below: _(You can click on the ⯈ to expand the topics)_ -### 📈 [Algorithms Analysis](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part01-algorithms-analysis.asc) +### 📈 [Algorithms Analysis](book/part01-algorithms-analysis.asc) -- [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/linked-list.asc): each data node has a link to the next (and +- [Linked List](book/content/part02/linked-list.asc): each data node has a link to the next (and previous). - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/linked-lists/linked-list.js) + [Code](src/data-structures/linked-lists/linked-list.js) | - [Linked List Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/linked-list.asc#linked-list-complexity-vs-array-complexity) + [Linked List Time Complexity](book/content/part02/linked-list.asc#linked-list-complexity-vs-array-complexity) -- [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/queue.asc): data flows in a "first-in, first-out" (FIFO) manner. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/queues/queue.js) +- [Queue](book/content/part02/queue.asc): data flows in a "first-in, first-out" (FIFO) manner. + [Code](src/data-structures/queues/queue.js) | - [Queue Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/queue.asc#queue-complexity) + [Queue Time Complexity](book/content/part02/queue.asc#queue-complexity) -- [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/stack.asc): data flows in a "last-in, first-out" (LIFO) manner. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/data-structures/stacks/stack.js) +- [Stack](book/content/part02/stack.asc): data flows in a "last-in, first-out" (LIFO) manner. + [Code](src/data-structures/stacks/stack.js) | - [Stack Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part02/stack.asc#stack-complexity) + [Stack Time Complexity](book/content/part02/stack.asc#stack-complexity) --- @@ -225,7 +225,7 @@ they take different time to complete. --- -#### [When to use an Array or Linked List. Know the tradeoffs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part02/array-vs-list-vs-queue-vs-stack.asc) +#### [When to use an Array or Linked List. Know the tradeoffs](book/content/part02/array-vs-list-vs-queue-vs-stack.asc) Use Arrays when… - You need to access data in random order fast (using an index). @@ -246,19 +246,19 @@ Use Linked Lists when: --- - #### [Build a List, Stack and a Queue from scratch](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part02-linear-data-structures.asc) + #### [Build a List, Stack and a Queue from scratch](book/part02-linear-data-structures.asc) Build any of these data structures from scratch: - - [Linked List](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/linked-lists/linked-list.js) - - [Stack](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/stacks/stack.js) - - [Queue](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/src/data-structures/queues/queue.js) + - [Linked List](src/data-structures/linked-lists/linked-list.js) + - [Stack](src/data-structures/stacks/stack.js) + - [Queue](src/data-structures/queues/queue.js) --- -### 🌲 [Non-Linear Data Structures](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) +### 🌲 [Non-Linear Data Structures](book/part03-graph-data-structures.asc) @@ -271,13 +271,13 @@ Use Linked Lists when: --- -#### [HashMaps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/map.asc) +#### [HashMaps](book/content/part03/map.asc) Learn how to implement different types of Maps such as: -- [HashMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/hashmap.asc) -- [TreeMap](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/treemap.asc) +- [HashMap](book/content/part03/hashmap.asc) +- [TreeMap](book/content/part03/treemap.asc) -Also, [learn the difference between the different Maps implementations](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/time-complexity-graph-data-structures.asc): +Also, [learn the difference between the different Maps implementations](book/content/part03/time-complexity-graph-data-structures.asc): - `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. - `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. @@ -296,60 +296,60 @@ Also, [learn the difference between the different Maps implementations](https:// --- -#### [Know the properties of Graphs and Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part03-graph-data-structures.asc) +#### [Know the properties of Graphs and Trees](book/part03-graph-data-structures.asc) -##### [Graphs](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/graph.asc) +##### [Graphs](book/content/part03/graph.asc) Know all the graphs properties with many images and illustrations. -![graph example with USA airports](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image46.png) +![graph example with USA airports](book/images/image46.png) **Graphs**: data **nodes** that can have a connection or **edge** to zero or more adjacent nodes. Unlike trees, nodes can have multiple parents, loops. - [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/graphs/graph.js) + [Code](src/data-structures/graphs/graph.js) | - [Graph Time Complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/graph.asc#graph-complexity) + [Graph Time Complexity](book/content/part03/graph.asc#graph-complexity) -#### [Trees](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/tree-intro.asc) +#### [Trees](book/content/part03/tree-intro.asc) Learn all the different kinds of trees and its properties. -![tree data structure properties](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image31.jpg) +![tree data structure properties](book/images/image31.jpg) - **Trees**: data nodes has zero or more adjacent nodes a.k.a. children. Each node can only have one parent node otherwise is a graph not a tree. - [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) + [Code](src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc) + [Docs](book/content/part03/tree-intro.asc) - **Binary Trees**: same as tree but only can have two children at most. - [Code](https://github.com/amejiarosario/algorithms.js/tree/master/src/data-structures/trees) + [Code](src/data-structures/trees) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/tree-intro.asc#binary-tree) + [Docs](book/content/part03/tree-intro.asc#binary-tree) - **Binary Search Trees** (BST): same as binary tree, but the nodes value keep this order `left < parent < right`. - [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/binary-search-tree.js) + [Code](src/data-structures/trees/binary-search-tree.js) | - [BST Time complexity](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part03/binary-search-tree.asc#tree-complexity) + [BST Time complexity](book/content/part03/binary-search-tree.asc#tree-complexity) - **AVL Trees**: Self-balanced BST to maximize look up time. - [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/avl-tree.js) + [Code](src/data-structures/trees/avl-tree.js) | - [AVL Tree docs](https://github.com/amejiarosario/dsa.js/blob/master/book/C-AVL-tree.asc) + [AVL Tree docs](book/C-AVL-tree.asc) | - [Self-balancing & tree rotations docs](https://github.com/amejiarosario/dsa.js/blob/master/book/B-self-balancing-binary-search-trees.asc) + [Self-balancing & tree rotations docs](book/B-self-balancing-binary-search-trees.asc) - **Red-Black Trees**: Self-balanced BST more loose than AVL to maximize insertion speed. - [Code](https://github.com/amejiarosario/algorithms.js/blob/master/src/data-structures/trees/red-black-tree.js) + [Code](src/data-structures/trees/red-black-tree.js) --- @@ -362,12 +362,12 @@ Learn all the different kinds of trees and its properties. --- -#### [Implement a binary search tree for fast lookups](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part03/binary-search-tree.asc) +#### [Implement a binary search tree for fast lookups](book/content/part03/binary-search-tree.asc) - Learn how to add/remove/update values in a tree: -![inserting node in a tree](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/raw/master/book/images/image36.png) +![inserting node in a tree](book/images/image36.png) -- [How to make a tree balanced?](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/B-self-balancing-binary-search-trees.asc) +- [How to make a tree balanced?](book/B-self-balancing-binary-search-trees.asc) From unbalanced BST to balanced BST ``` @@ -384,7 +384,7 @@ From unbalanced BST to balanced BST -### ⚒ [Algorithmic Toolbox](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +### ⚒ [Algorithmic Toolbox](book/part04-algorithmic-toolbox.asc) @@ -398,7 +398,7 @@ From unbalanced BST to balanced BST --- -#### [Never get stuck solving a problem with 7 simple steps](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +#### [Never get stuck solving a problem with 7 simple steps](book/part04-algorithmic-toolbox.asc) 1. Understand the problem 1. Build a simple example (no edge cases yet) @@ -408,7 +408,7 @@ From unbalanced BST to balanced BST 1. Write Code, yes, now you can code. 1. Test your written code -Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +Full details [here](book/part04-algorithmic-toolbox.asc) --- @@ -420,34 +420,34 @@ Full details [here](https://github.com/amejiarosario/dsa.js-data-structures-and- --- -#### [Master the most popular sorting algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/sorting-algorithms.asc) +#### [Master the most popular sorting algorithms](book/content/part04/sorting-algorithms.asc) We are going to explore three basic sorting algorithms O(n2) which have low overhead: - Bubble Sort. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/bubble-sort.js) + [Code](src/algorithms/sorting/bubble-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/bubble-sort.asc) + [Docs](book/content/part04/bubble-sort.asc) - Insertion Sort. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/insertion-sort.js) + [Code](src/algorithms/sorting/insertion-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/insertion-sort.asc) + [Docs](book/content/part04/insertion-sort.asc) - Selection Sort. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/selection-sort.js) + [Code](src/algorithms/sorting/selection-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/selection-sort.asc) + [Docs](book/content/part04/selection-sort.asc) and then discuss efficient sorting algorithms O(n log n) such as: - Merge Sort. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/merge-sort.js) + [Code](src/algorithms/sorting/merge-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/merge-sort.asc) + [Docs](book/content/part04/merge-sort.asc) - Quick sort. - [Code](https://github.com/amejiarosario/dsa.js/blob/master/src/algorithms/sorting/quick-sort.js) + [Code](src/algorithms/sorting/quick-sort.js) | - [Docs](https://github.com/amejiarosario/dsa.js/blob/master/book/content/part04/quick-sort.asc) + [Docs](book/content/part04/quick-sort.asc) --- @@ -459,13 +459,13 @@ and then discuss efficient sorting algorithms O(n log n) such as: --- -#### [Learn different approaches to solve algorithmic problems](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/part04-algorithmic-toolbox.asc) +#### [Learn different approaches to solve algorithmic problems](book/part04-algorithmic-toolbox.asc) We are going to discuss the following techniques for solving algorithms problems: -- [Greedy Algorithms](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/bbook/content/part04/greedy-algorithms.asc): makes greedy choices using heuristics to find the best solution without looking back. -- [Dynamic Programming](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. -- [Divide and Conquer](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. -- [Backtracking](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. +- [Greedy Algorithms](book/content/part04/greedy-algorithms.asc): makes greedy choices using heuristics to find the best solution without looking back. +- [Dynamic Programming](book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. +- [Divide and Conquer](book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. +- [Backtracking](book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. - _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). --- @@ -515,4 +515,4 @@ The best way to support this project is buying the [book](https://books.adrianme ## License -[![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](https://github.com/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/blob/master/LICENSE) +[![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](LICENSE) From 5e4fa83fa2262e00e2f9d979a3a50bbd1806a3ed Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 07:28:39 -0400 Subject: [PATCH 005/200] docs: add book readme --- book/config | 2 +- book/{dsajs.asc => readme.asc} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename book/{dsajs.asc => readme.asc} (100%) diff --git a/book/config b/book/config index 32d0d63b..f657e9bf 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit 32d0d63bf236990c3201c3e53ca357718ba6b9a8 +Subproject commit f657e9bf4325d4987a30cfc47ad2bbc4bda6b23c diff --git a/book/dsajs.asc b/book/readme.asc similarity index 100% rename from book/dsajs.asc rename to book/readme.asc From 6a06e3b75915a72ef0dd5ee9d37dcf434c4c8e18 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 07:36:31 -0400 Subject: [PATCH 006/200] fix(book): remove lorem ipsum --- book/part01-algorithms-analysis.asc | 4 ---- package.json | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/book/part01-algorithms-analysis.asc b/book/part01-algorithms-analysis.asc index aefd21c1..e4eba82d 100644 --- a/book/part01-algorithms-analysis.asc +++ b/book/part01-algorithms-analysis.asc @@ -6,7 +6,3 @@ In this part, we are going to cover the basics of algorithms analysis. Also, we include::content/part01/algorithms-analysis.asc[] include::content/part01/big-o-examples.asc[] - -=== Summary - -Lorem ipsum dolor sit, amet consectetur adipisicing elit. Aut, optio harum. Rem assumenda iste est delectus quas corporis tenetur esse neque id officia expedita porro sit, totam rerum illo cupiditate. diff --git a/package.json b/package.json index ef2c1365..7db6917e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.0", + "version": "1.3.1", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From ab8b641a61f745bd41ecf48038baff2554388d17 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 07:47:04 -0400 Subject: [PATCH 007/200] docs(book): fix relative images path --- book/content/part01/algorithms-analysis.asc | 2 +- book/content/part01/big-o-examples.asc | 2 +- book/content/part02/array-vs-list-vs-queue-vs-stack.asc | 2 +- book/content/part02/array.asc | 2 +- book/content/part02/linked-list.asc | 2 +- book/content/part02/queue.asc | 2 +- book/content/part02/stack.asc | 2 +- book/content/part03/binary-search-tree-traversal.asc | 2 +- book/content/part03/binary-search-tree.asc | 2 +- book/content/part03/graph-search.asc | 2 +- book/content/part03/graph.asc | 2 +- book/content/part03/hashmap.asc | 2 +- book/content/part03/map.asc | 2 +- book/content/part03/set.asc | 2 +- book/content/part03/time-complexity-graph-data-structures.asc | 2 +- book/content/part03/tree-intro.asc | 2 +- book/content/part03/tree-search-traversal.asc | 2 +- book/content/part03/treemap.asc | 2 +- book/content/part04/algorithmic-toolbox.asc | 2 +- book/content/part04/backtracking.asc | 2 +- book/content/part04/bubble-sort.asc | 2 +- book/content/part04/divide-and-conquer.asc | 2 +- book/content/part04/dynamic-programming.asc | 2 +- book/content/part04/greedy-algorithms.asc | 2 +- book/content/part04/insertion-sort.asc | 2 +- book/content/part04/merge-sort.asc | 2 +- book/content/part04/quick-sort.asc | 2 +- book/content/part04/selection-sort.asc | 2 +- book/content/part04/sorting-algorithms.asc | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index fab397fe..a111f7d8 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part01/big-o-examples.asc b/book/content/part01/big-o-examples.asc index 38cb3ba5..abc3f65c 100644 --- a/book/content/part01/big-o-examples.asc +++ b/book/content/part01/big-o-examples.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc index 127ce33b..cbf95e7a 100644 --- a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 41bd6ef3..b301f7cf 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index f253ac34..d05ed265 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index a20f2f22..5f740001 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 6b4df7dc..09b8a741 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/binary-search-tree-traversal.asc b/book/content/part03/binary-search-tree-traversal.asc index 58555c91..974c6fbc 100644 --- a/book/content/part03/binary-search-tree-traversal.asc +++ b/book/content/part03/binary-search-tree-traversal.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/binary-search-tree.asc b/book/content/part03/binary-search-tree.asc index 4c506cda..bfe81ddc 100644 --- a/book/content/part03/binary-search-tree.asc +++ b/book/content/part03/binary-search-tree.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/graph-search.asc b/book/content/part03/graph-search.asc index d19d5fd6..48bf5308 100644 --- a/book/content/part03/graph-search.asc +++ b/book/content/part03/graph-search.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/graph.asc b/book/content/part03/graph.asc index 35d15b40..952c14da 100644 --- a/book/content/part03/graph.asc +++ b/book/content/part03/graph.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/hashmap.asc b/book/content/part03/hashmap.asc index 2a00067f..8ae810ab 100644 --- a/book/content/part03/hashmap.asc +++ b/book/content/part03/hashmap.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/map.asc b/book/content/part03/map.asc index d03dae4f..44b15eba 100644 --- a/book/content/part03/map.asc +++ b/book/content/part03/map.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/set.asc b/book/content/part03/set.asc index 79dd30e9..04b95a01 100644 --- a/book/content/part03/set.asc +++ b/book/content/part03/set.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc index 4739c624..739ef4d1 100644 --- a/book/content/part03/time-complexity-graph-data-structures.asc +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/tree-intro.asc b/book/content/part03/tree-intro.asc index 632e22ee..4778e014 100644 --- a/book/content/part03/tree-intro.asc +++ b/book/content/part03/tree-intro.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/tree-search-traversal.asc b/book/content/part03/tree-search-traversal.asc index 418edaae..14179770 100644 --- a/book/content/part03/tree-search-traversal.asc +++ b/book/content/part03/tree-search-traversal.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part03/treemap.asc b/book/content/part03/treemap.asc index 61e91436..4200ac19 100644 --- a/book/content/part03/treemap.asc +++ b/book/content/part03/treemap.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/algorithmic-toolbox.asc b/book/content/part04/algorithmic-toolbox.asc index 467d5180..f100524a 100644 --- a/book/content/part04/algorithmic-toolbox.asc +++ b/book/content/part04/algorithmic-toolbox.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/backtracking.asc b/book/content/part04/backtracking.asc index 7faaf9f1..f92819dc 100644 --- a/book/content/part04/backtracking.asc +++ b/book/content/part04/backtracking.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/bubble-sort.asc b/book/content/part04/bubble-sort.asc index f49ddac3..ed146f7d 100644 --- a/book/content/part04/bubble-sort.asc +++ b/book/content/part04/bubble-sort.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/divide-and-conquer.asc b/book/content/part04/divide-and-conquer.asc index be80b106..a3820b72 100644 --- a/book/content/part04/divide-and-conquer.asc +++ b/book/content/part04/divide-and-conquer.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc index 411c6f45..25bf3ce0 100644 --- a/book/content/part04/dynamic-programming.asc +++ b/book/content/part04/dynamic-programming.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/greedy-algorithms.asc b/book/content/part04/greedy-algorithms.asc index c28abd6e..30a2a494 100644 --- a/book/content/part04/greedy-algorithms.asc +++ b/book/content/part04/greedy-algorithms.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/insertion-sort.asc b/book/content/part04/insertion-sort.asc index c8bc818d..02147c51 100644 --- a/book/content/part04/insertion-sort.asc +++ b/book/content/part04/insertion-sort.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/merge-sort.asc b/book/content/part04/merge-sort.asc index 65e90f0d..c3f90ad3 100644 --- a/book/content/part04/merge-sort.asc +++ b/book/content/part04/merge-sort.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/quick-sort.asc b/book/content/part04/quick-sort.asc index a2d0e32d..0e856679 100644 --- a/book/content/part04/quick-sort.asc +++ b/book/content/part04/quick-sort.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/selection-sort.asc b/book/content/part04/selection-sort.asc index f4787e05..4d1daf63 100644 --- a/book/content/part04/selection-sort.asc +++ b/book/content/part04/selection-sort.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 878029ab..09135bc8 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -1,5 +1,5 @@ ifndef::imagesdir[] -:imagesdir: ../../ +:imagesdir: ../../images :codedir: ../../../src endif::[] From 1b50d4984ded000ce4444484909681d154c5dec2 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 08:13:27 -0400 Subject: [PATCH 008/200] docs(src): fix readme links --- README.md | 29 +++++++++---------- src/README.adoc | 1 - src/algorithms/README.adoc | 2 +- src/data-structures/arrays/README.adoc | 2 +- src/data-structures/graphs/README.adoc | 2 +- src/data-structures/linked-lists/README.adoc | 2 +- src/data-structures/maps/README.adoc | 8 ++++- src/data-structures/maps/hash-maps/readme.asc | 1 + src/data-structures/maps/tree-maps/readme.asc | 1 + src/data-structures/queues/README.adoc | 2 +- src/data-structures/sets/README.adoc | 2 +- src/data-structures/stacks/README.adoc | 2 +- src/data-structures/trees/README.adoc | 17 ++++++++++- 13 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 src/data-structures/maps/hash-maps/readme.asc create mode 100644 src/data-structures/maps/tree-maps/readme.asc diff --git a/README.md b/README.md index 9f40cc4e..5c4ee291 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -[![image](https://user-images.githubusercontent.com/418605/59557258-10742880-8fa3-11e9-84fb-4d66a9d89faa.png)](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) +![image](https://user-images.githubusercontent.com/418605/59557258-10742880-8fa3-11e9-84fb-4d66a9d89faa.png) # Data Structures and Algorithms in JavaScript -[![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![Slack](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) +[![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![chat](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) > This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. @@ -38,15 +38,11 @@ https://img.shields.io/github/repo-size/amejiarosario/dsa.js.svg - 98.1 MB - [🥞 Linear Data Structures](#-linear-data-structures) - [🌲 Non-Linear Data Structures](#-non-linear-data-structures) - [⚒ Algorithms Techniques](#%E2%9A%92-algorithms-techniques) +- [Book](#book) - [FAQ](#faq) - [Support](#support) -- [Donations](#donations) - [License](#license) -- [Book](#book) -- [Data Structures](#data-structures) - - [Linear Data Structures](#linear-data-structures) - - [Non-Linear Data Structures](#non-linear-data-structures) -- [Algorithms](#algorithms) + @@ -486,7 +482,7 @@ We are going to discuss the following techniques for solving algorithms problems

- Hey OP, why you created this repo/book? + Why you created this repo/book?

There are not many books about Algorithms in JavaScript. This material fills the gap. Also, it's good practice :) @@ -497,21 +493,22 @@ We are going to discuss the following techniques for solving algorithms problems

Is there anyone I can contact if I have questions about something in particular?

- Yes, open an issue or ask questions on the slack channel. + Yes, open an issue or ask questions on the [slack channel](https://dsajs-slackin.herokuapp.com).

-## Support +## Book -Reach out to me at one of the following places! +This project is also available in a [book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/). You will get a nicely formatted PDF with 180+ pages + ePub and Mobi version. -- Twitter at `@amejiarosario` -- Slack at `dsajs.slack.com` +[![dsa.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/img/dsajs-cover-320h2.png)](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) +## Support -## Donations +Reach out to me at one of the following places! -The best way to support this project is buying the [book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/), so I can invest more time into this project and keep improving it. +- Twitter at `@amejiarosario` +- Chat on `dsajs.slack.com` ## License diff --git a/src/README.adoc b/src/README.adoc index c19a5b8e..3eed7bcc 100644 --- a/src/README.adoc +++ b/src/README.adoc @@ -9,4 +9,3 @@ The implementations are divided in two main parts: - https://github.com/amejiarosario/dsa.js/tree/master/src/algorithms[Algorithms] - https://github.com/amejiarosario/dsa.js/tree/master/src/data-structures[Data Structures] -NOTE: `runtimes` directory is just for blog/book examples but not exposed throught the public API. diff --git a/src/algorithms/README.adoc b/src/algorithms/README.adoc index 8eb856f1..83fd7c26 100644 --- a/src/algorithms/README.adoc +++ b/src/algorithms/README.adoc @@ -1 +1 @@ -include::../../book/chapters/part4.adoc[] +include::../../book/part04-algorithmic-toolbox.asc[] diff --git a/src/data-structures/arrays/README.adoc b/src/data-structures/arrays/README.adoc index 46d92682..87fe3e42 100644 --- a/src/data-structures/arrays/README.adoc +++ b/src/data-structures/arrays/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/array.adoc[] +include::../../../book/content/part02/array.asc[] diff --git a/src/data-structures/graphs/README.adoc b/src/data-structures/graphs/README.adoc index c8bcfcf5..90a88bd5 100644 --- a/src/data-structures/graphs/README.adoc +++ b/src/data-structures/graphs/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/graph.adoc[] +include::../../../book/content/part03/graph.asc[] diff --git a/src/data-structures/linked-lists/README.adoc b/src/data-structures/linked-lists/README.adoc index 4058cc74..62290fdd 100644 --- a/src/data-structures/linked-lists/README.adoc +++ b/src/data-structures/linked-lists/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/linked-list.adoc[] +include::../../../book/content/part02/linked-list.asc[] diff --git a/src/data-structures/maps/README.adoc b/src/data-structures/maps/README.adoc index ffbc4740..4448f31a 100644 --- a/src/data-structures/maps/README.adoc +++ b/src/data-structures/maps/README.adoc @@ -1 +1,7 @@ -include::../../../book/chapters/map.adoc[] +include::../../../book/content/part03/map.asc[] + +<<< +include::../../../book/content/part03/hashmap.asc[] + +<<< +include::../../../book/content/part03/treemap.asc[] diff --git a/src/data-structures/maps/hash-maps/readme.asc b/src/data-structures/maps/hash-maps/readme.asc new file mode 100644 index 00000000..2f9102f0 --- /dev/null +++ b/src/data-structures/maps/hash-maps/readme.asc @@ -0,0 +1 @@ +include::../../../book/content/part03/hashmap.asc[] diff --git a/src/data-structures/maps/tree-maps/readme.asc b/src/data-structures/maps/tree-maps/readme.asc new file mode 100644 index 00000000..dbdfc733 --- /dev/null +++ b/src/data-structures/maps/tree-maps/readme.asc @@ -0,0 +1 @@ +include::../../../book/content/part03/treemap.asc[] diff --git a/src/data-structures/queues/README.adoc b/src/data-structures/queues/README.adoc index f475e9a8..68aa475e 100644 --- a/src/data-structures/queues/README.adoc +++ b/src/data-structures/queues/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/queue.adoc[] +include::../../../book/content/part02/queue.asc[] diff --git a/src/data-structures/sets/README.adoc b/src/data-structures/sets/README.adoc index ae595fda..a7dfc61a 100644 --- a/src/data-structures/sets/README.adoc +++ b/src/data-structures/sets/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/set.adoc[] +include::../../../book/content/part03/set.asc[] diff --git a/src/data-structures/stacks/README.adoc b/src/data-structures/stacks/README.adoc index 28c87763..7cdcbe0e 100644 --- a/src/data-structures/stacks/README.adoc +++ b/src/data-structures/stacks/README.adoc @@ -1 +1 @@ -include::../../../book/chapters/stack.adoc[] +include::../../../book/content/part02/stack.asc[] diff --git a/src/data-structures/trees/README.adoc b/src/data-structures/trees/README.adoc index 321ad041..2a652738 100644 --- a/src/data-structures/trees/README.adoc +++ b/src/data-structures/trees/README.adoc @@ -1 +1,16 @@ -include::../../../book/chapters/tree.adoc[] +include::../../../book/content/part03/tree-intro.asc[] + +<<< +include::../../../book/content/part03/binary-search-tree.asc[] + +<<< +include::../../../book/content/part03/tree-search-traversal.asc[] + +<<< +include::../../../book/content/part03/binary-search-tree-traversal.asc[] + +<<< +include::../../../book/B-self-balancing-binary-search-trees.asc[] + +<<< +include::../../../book/C-AVL-tree.asc[] From 7aa63ffab2fed75b4560d07268f9a88733b6e2e0 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Jun 2019 09:21:48 -0400 Subject: [PATCH 009/200] docs: update repo name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c4ee291..527ae4fa 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Data Structures and Algorithms in JavaScript -[![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![chat](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) +[![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-algorithms-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![chat](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) > This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. From fd3ab480f2bb7cc2b7ce45da4e6a41831eafb7bf Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 8 Jul 2019 17:12:57 -0400 Subject: [PATCH 010/200] fix(queue): runtime error --- book/content/part02/queue.asc | 2 +- package.json | 2 +- src/data-structures/queues/queue-1.js | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 5f740001..626d7417 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -76,7 +76,7 @@ As an experiment, we can see in the following table that if we had implemented t |=== .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) +| Queue (w/array) ^|- ^|- ^|- ^|- ^|O(1) ^|*O(n)* ^|- ^|- ^|O(n) | Queue (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) |=== // end::table[] diff --git a/package.json b/package.json index 7db6917e..4f51594c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.1", + "version": "1.3.2", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", diff --git a/src/data-structures/queues/queue-1.js b/src/data-structures/queues/queue-1.js index aa7082b3..b82c9721 100644 --- a/src/data-structures/queues/queue-1.js +++ b/src/data-structures/queues/queue-1.js @@ -8,6 +8,7 @@ class Queue { /** * Add element to the queue + * Insert to the end of the array * Runtime: O(1) * @param {any} element */ @@ -17,7 +18,8 @@ class Queue { /** * Add element to the queue - * Runtime: O(1) + * Removing from the beginning of the array + * Runtime: O(n) * @param {any} element */ remove() { From 02836a0d930e1769471b12a15c328cd8bd70af64 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 8 Jul 2019 17:27:33 -0400 Subject: [PATCH 011/200] docs: fix broken links --- src/data-structures/maps/hash-maps/readme.asc | 2 +- src/data-structures/maps/tree-maps/readme.asc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data-structures/maps/hash-maps/readme.asc b/src/data-structures/maps/hash-maps/readme.asc index 2f9102f0..6a2c8cce 100644 --- a/src/data-structures/maps/hash-maps/readme.asc +++ b/src/data-structures/maps/hash-maps/readme.asc @@ -1 +1 @@ -include::../../../book/content/part03/hashmap.asc[] +include::../../../../book/content/part03/hashmap.asc[] diff --git a/src/data-structures/maps/tree-maps/readme.asc b/src/data-structures/maps/tree-maps/readme.asc index dbdfc733..0321f3f1 100644 --- a/src/data-structures/maps/tree-maps/readme.asc +++ b/src/data-structures/maps/tree-maps/readme.asc @@ -1 +1 @@ -include::../../../book/content/part03/treemap.asc[] +include::../../../../book/content/part03/treemap.asc[] From a060413b578671dd3d795374192626ed2831d015 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2019 12:05:08 +0000 Subject: [PATCH 012/200] build(deps): bump lodash from 4.17.11 to 4.17.14 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.14. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.14) Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d285e8d5..79c75fba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.0", + "version": "1.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -3928,9 +3928,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", "dev": true }, "lodash.sortby": { From 375098f80030eaaf65d6a1921a8116731a8c98b3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 22 Jul 2019 15:43:24 -0400 Subject: [PATCH 013/200] docs(greedy): fix grammar issues/typos --- book/content/part04/greedy-algorithms.asc | 10 +++++----- book/content/part04/merge-sort.asc | 4 ++-- package.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/book/content/part04/greedy-algorithms.asc b/book/content/part04/greedy-algorithms.asc index 30a2a494..5c35e3ad 100644 --- a/book/content/part04/greedy-algorithms.asc +++ b/book/content/part04/greedy-algorithms.asc @@ -26,7 +26,7 @@ graph G { } .... -Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. +Let's say the greedy heuristics are set to take the more significant value. The greedy algorithm will start at the root and say, "Which number is bigger 3 or 7?" Then go with 7 and later 4. As you can see in the diagram, the most significant sum would be the path `7 - 3 - 87`. A greedy algorithm never goes back on its options. This greedy choice makes it different from dynamic programming which exhaustive and it's guaranteed to find the best option. However, when they work well, they are usually faster than other options. Greedy algorithms are well suited when an optimal local solution is also a globally optimal solution. @@ -38,7 +38,7 @@ This algorithm only gives one shot at finding the solution and never goes back t Don't get the wrong idea; some greedy algorithms work very well if they are designed correctly. -.Some examples of greedy algorithms that works well: +.Some examples of greedy algorithms that work well: - <>: we select the best (minimum value) remove it from the input and then select the next minimum until everything is processed. - <>: the "merge" uses a greedy algorithm, where it combines two sorted arrays by looking at their current values and choosing the best (minimum) at every time. indexterm:[Merge Sort] @@ -78,11 +78,11 @@ How would you solve this problem? First, we have to define what parameters are we going to use to make our *greedy choice*. This some ideas: -- We can take items with the *largest* value in hopes to maximize profit. Based on that we can make take the last item and first having a total weight of 7 and a total cost of 8. +- We can take items with the *largest* value in hopes to maximize profit. Based on that we can take the last and the first one to have a total weight of 7 and a total cost of 8. -- Also, we could take items *smallest* weight so we can fit as much as possible. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This is worse than picking the largest value! [big]#👎# +- Also, we could take items with the *smallest* weight so we can fit as much as possible in the knapsack. Let's analyze both options. So we can choose the first two items for a total value of 5 and a total weight of 4. This option is worse than picking the most significant value! [big]#👎# -- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. This heuristics seems to be the most profitable. [big]#👍# +- One last idea, we can take items based on the *best* value/weight ratio and take fractions of an article to fill up the knapsack to maximum weight. In that case, we can buy the last item in full and 2/3 of the 2nd item. We get a total value of `9.67` and a total weight of `7`. These heuristics seem to be the most profitable. [big]#👍# .Items value/weight ratio ---- diff --git a/book/content/part04/merge-sort.asc b/book/content/part04/merge-sort.asc index c3f90ad3..b4ee8fe9 100644 --- a/book/content/part04/merge-sort.asc +++ b/book/content/part04/merge-sort.asc @@ -25,7 +25,7 @@ include::{codedir}/algorithms/sorting/merge-sort.js[tag=sort, indent=0] ---- <1> Convert any kind of iterable (array, sets, etc.) into an array -As you can see this function is just a wrapper to transform things into an array. The heavy lifting is done in `splitSort` as you can see below. +As you can see, this function is just a wrapper to transform things into an array. The heavy lifting is done in `splitSort` as you can see below. .Merge Sort implementation in JavaScript (splitSort) [source, javascript] @@ -43,7 +43,7 @@ Let's take a look at the merge function: ---- include::{codedir}/algorithms/sorting/merge-sort.js[tag=merge, indent=0] ---- -<1> We need to keep track of 3 arrays indices: `index` which keeps track of the combined array position, `i1` which is the `array1` index and `a2` for `array2`. +<1> We need to keep track of 3 arrays indices: `index` which keeps track of the combined array position, `i1` which is the `array1` index and `i2` for `array2`. <2> If `array1` current element (`i1`) has the lowest value, we insert it into the `mergedArray` if not we then insert `array2` element. <3> `mergedArray` is `array1` and `array2` combined in ascending order (sorted). diff --git a/package.json b/package.json index 4f51594c..af9df95a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.2", + "version": "1.3.3", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 0c8f243ea459247e2c9b52d797258d8e730d879a Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 3 Aug 2019 10:01:28 -0400 Subject: [PATCH 014/200] Update README.md Better grammar --- README.md | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 527ae4fa..9fbfe661 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. -> In this repository, you can find the implementation of algorithms and data structures. They are implemented and explained in JavaScript. This material can be used as a reference manual for developers. You can refresh specific topics before an interview. Also, you can find ideas to solve problems more efficiently. +> In this repository, you can find the implementation of algorithms and data structures in JavaScript. This material can be used as a reference manual for developers, or you can refresh specific topics before an interview. Also, you can find ideas to solve problems more efficiently. @@ -68,12 +68,12 @@ For a full list of all the exposed data structures and algorithms [see](src/inde Algorithms are an essential toolbox for every programmer. -You usually need algorithms when you have to sort data, search for a value, transform data, scale your code to many users just to name a few. +You usually need algorithms when you have to sort data, search for a value, transform data, scale your code to many users, to name a few. Algorithms are just the step you follow to solve a problem while data structures are where you store the data for later manipulation. Both combined create programs. > Algorithms + Data Structures = Programs. -It's true that most programming languages and libraries provides implementations for basic data structures and algorithms. +Most programming languages and libraries indeed provide implementations for basic data structures and algorithms. However, to make use of data structures properly, you have to know the tradeoffs so you can choose the best tool for the job. This material is going to teach you to: @@ -85,13 +85,13 @@ This material is going to teach you to: ## What's Inside -All the code and explanations are available on this repo. You can dig through the links and code examples from the ([src folder](src)). However, the inline code examples are not expanded (because of Github's asciidoc limitations) but you can follow the path and see the implementation. +All the code and explanations are available on this repo. You can dig through the links and code examples from the ([src folder](src)). However, the inline code examples are not expanded (because of Github's asciidoc limitations), but you can follow the path and see the implementation. -_Note: If you prefer to consume the information in a more linear fashion then the [book format](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) would be more appropriate for you._ +_Note: If you prefer to consume the information more linearly then the [book format](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) would be more appropriate for you._ -The topics are divided in 4 main categories as you can see below: +The topics are divided into four main categories as you can see below: -_(You can click on the ⯈ to expand the topics)_ +_(You can click on the triangle ⯈ to expand the topics)_ ### 📈 [Algorithms Analysis](book/part01-algorithms-analysis.asc) @@ -130,7 +130,7 @@ _(You can click on the ⯈ to expand the topics)_ #### Comparing algorithms using Big O notation Let's say you want to find the duplicates on an array. -Using Big O notation we can compare different implementations that do exactly the same but +Using Big O notation, we can compare different implementations that do the same but they take different time to complete. - [Optimal solution using a map](book/content/part01/big-o-examples.asc#linear-example) @@ -237,7 +237,7 @@ Use Linked Lists when:
- Build a List, Stack and a Queue. + Build a List, Stack, and a Queue. --- @@ -277,7 +277,7 @@ Also, [learn the difference between the different Maps implementations](book/con - `HashMap` is more time-efficient. A `TreeMap` is more space-efficient. - `TreeMap` search complexity is *O(log n)*, while an optimized `HashMap` is *O(1)* on average. -- `HashMap`’s keys are in insertion order (or random depending in the implementation). `TreeMap`’s keys are always sorted. +- `HashMap`’s keys are in insertion order (or random depending on the implementation). `TreeMap`’s keys are always sorted. - `TreeMap` offers some statistical data for free such as: get minimum, get maximum, median, find ranges of keys. `HashMap` doesn’t. - `TreeMap` has a guarantee always an *O(log n)*, while `HashMap`s has an amortized time of *O(1)* but in the rare case of a rehash, it would take an *O(n)*. @@ -309,7 +309,7 @@ Know all the graphs properties with many images and illustrations. #### [Trees](book/content/part03/tree-intro.asc) -Learn all the different kinds of trees and its properties. +Learn all the different kinds of trees and their properties. ![tree data structure properties](book/images/image31.jpg) @@ -321,21 +321,21 @@ Learn all the different kinds of trees and its properties. [Docs](book/content/part03/tree-intro.asc) - - **Binary Trees**: same as tree but only can have two children at + - **Binary Trees**: same as a tree but only can have two children at most. [Code](src/data-structures/trees) | [Docs](book/content/part03/tree-intro.asc#binary-tree) - - **Binary Search Trees** (BST): same as binary tree, but the + - **Binary Search Trees** (BST): same as a binary tree, but the nodes value keep this order `left < parent < right`. [Code](src/data-structures/trees/binary-search-tree.js) | [BST Time complexity](book/content/part03/binary-search-tree.asc#tree-complexity) - - **AVL Trees**: Self-balanced BST to maximize look up time. + - **AVL Trees**: Self-balanced BST to maximize lookup time. [Code](src/data-structures/trees/avl-tree.js) | [AVL Tree docs](book/C-AVL-tree.asc) @@ -343,7 +343,7 @@ Learn all the different kinds of trees and its properties. [Self-balancing & tree rotations docs](book/B-self-balancing-binary-search-trees.asc) - - **Red-Black Trees**: Self-balanced BST more loose than AVL to + - **Red-Black Trees**: Self-balanced BST looser than AVL to maximize insertion speed. [Code](src/data-structures/trees/red-black-tree.js) @@ -383,7 +383,7 @@ From unbalanced BST to balanced BST ### ⚒ [Algorithmic Toolbox](book/part04-algorithmic-toolbox.asc) - +
@@ -399,7 +399,7 @@ From unbalanced BST to balanced BST 1. Understand the problem 1. Build a simple example (no edge cases yet) 1. Brainstorm solutions (greedy algorithm, Divide and Conquer, Backtracking, brute force) -1. Test your solution on the simple example (mentally) +1. Test your answer on the simple example (mentally) 1. Optimize the solution 1. Write Code, yes, now you can code. 1. Test your written code @@ -411,14 +411,14 @@ Full details [here](book/part04-algorithmic-toolbox.asc)
- Master the most popular sorting algorithms (mergesort, quicksort, insertion sort, ...) + Master the most popular sorting algorithms (merge sort, quicksort, insertion sort, etc.) --- #### [Master the most popular sorting algorithms](book/content/part04/sorting-algorithms.asc) -We are going to explore three basic sorting algorithms O(n2) which have low overhead: +We are going to explore three essential sorting algorithms O(n^2), which have low overhead: - Bubble Sort. [Code](src/algorithms/sorting/bubble-sort.js) | @@ -440,7 +440,7 @@ and then discuss efficient sorting algorithms O(n log n) such as: | [Docs](book/content/part04/merge-sort.asc) - - Quick sort. + - Quicksort. [Code](src/algorithms/sorting/quick-sort.js) | [Docs](book/content/part04/quick-sort.asc) @@ -462,7 +462,7 @@ We are going to discuss the following techniques for solving algorithms problems - [Dynamic Programming](book/content/part04/dynamic-programming.asc): a technique for speeding up recursive algorithms when there are many _overlapping subproblems_. It uses _memoization_ to avoid duplicating work. - [Divide and Conquer](book/content/part04/divide-and-conquer.asc): _divide_ problems into smaller pieces, _conquer_ each subproblem and then _join_ the results. - [Backtracking](book/content/part04/backtracking.asc): search _all (or some)_ possible paths. However, it stops and _go back_ as soon as notice the current solution is not working. -- _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point to optimize it with other techniques). +- _Brute Force_: generate all possible solutions and tries all of them. (Use it as a last resort or as the starting point). --- @@ -474,10 +474,7 @@ We are going to discuss the following techniques for solving algorithms problems
How would I apply these to my day-to-day work?

- As a programmer, we have to solve problems every day. If you want to solve problems well, then it's good to - know about a broad range of solutions. A lot of times, it's more efficient to learn existing resources than - stumble upon the answer yourself. The more tools and practice you have, the better. This book helps you - understand the tradeoffs among data structures and reason about algorithms performance. + As a programmer, we have to solve problems every day. If you want to solve problems well, then it's good to know about a broad range of solutions. A lot of times, it's more efficient to learn existing resources than stumble upon the answer yourself. The more tools and practice you have, the better. This book helps you understand the tradeoffs among data structures and reason about algorithms performance.

@@ -513,3 +510,5 @@ Reach out to me at one of the following places! ## License [![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](LICENSE) + +test From df5b70ecf5fdc5e2ee6137836cc2c186c649a87e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 3 Aug 2019 10:03:39 -0400 Subject: [PATCH 015/200] Fix broken image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9fbfe661..35c74298 100644 --- a/README.md +++ b/README.md @@ -498,7 +498,7 @@ We are going to discuss the following techniques for solving algorithms problems This project is also available in a [book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/). You will get a nicely formatted PDF with 180+ pages + ePub and Mobi version. -[![dsa.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/img/dsajs-cover-320h2.png)](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) +[![dsa.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/images/dsajs-cover-320h2.png)](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) ## Support From ec3c984ee6babb0a5b5cdb49602d83b8ab73a970 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 3 Aug 2019 10:06:57 -0400 Subject: [PATCH 016/200] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35c74298..05525b07 100644 --- a/README.md +++ b/README.md @@ -511,4 +511,4 @@ Reach out to me at one of the following places! [![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](LICENSE) -test +![](http://app.uxeranalytics.com/image1.png?uxa=github-dsajs) From 5dc709192c6c071f3c9a8e3d4014c2c47e33822d Mon Sep 17 00:00:00 2001 From: Josh Moncrieff Date: Sun, 11 Aug 2019 10:47:03 +1000 Subject: [PATCH 017/200] docs(book): fix grammar and typos in part01 --- book/content/part01/algorithms-analysis.asc | 8 ++++---- book/content/part01/big-o-examples.asc | 22 ++++++++++----------- package-lock.json | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index a111f7d8..92ca306e 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -115,7 +115,7 @@ When we are comparing algorithms, we don't want to have complex expressions. Wha TIP: Asymptotic analysis describes the behavior of functions as their inputs approach to infinity. -In the previous example, we analyzed `getMin` with an array of size 3; what happen size is 10 or 10k or a million? +In the previous example, we analyzed `getMin` with an array of size 3; what happens if the size is 10, 10k, or 10 million? (((Tables, Intro, Operations of 3n+3))) .Operations performed by an algorithm with a time complexity of `3n + 3` @@ -152,11 +152,11 @@ To sum up: TIP: Big O only cares about the highest order of the run time function and the worst-case scenario. -WARNING: Don't drop terms that multiplying other terms. _O(n log n)_ is not equivalent to _O(n)_. However, _O(n + log n)_ is. +WARNING: Don't drop terms that are multiplying other terms. _O(n log n)_ is not equivalent to _O(n)_. However, _O(n + log n)_ is. There are many common notations like polynomial, _O(n^2^)_ like we saw in the `getMin` example; constant _O(1)_ and many more that we are going to explore in the next chapter. -Again, time complexity is not a direct measure of how long a program takes to execute but rather how many operations it performs in given the input size. Nevertheless, there’s a relationship between time complexity and clock time as we can see in the following table. +Again, time complexity is not a direct measure of how long a program takes to execute, but rather how many operations it performs given the input size. Nevertheless, there’s a relationship between time complexity and clock time as we can see in the following table. (((Tables, Intro, Input size vs clock time by Big O))) // tag::table[] @@ -172,7 +172,7 @@ Again, time complexity is not a direct measure of how long a program takes to ex |=============================================================== // end::table[] -This just an illustration since in different hardware the times will be slightly different. +This is just an illustration since in different hardware the times will be slightly different. NOTE: These times are under the assumption of running on 1 GHz CPU and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. Regardless, bad algorithms would perform poorly even on a supercomputer. diff --git a/book/content/part01/big-o-examples.asc b/book/content/part01/big-o-examples.asc index abc3f65c..55042627 100644 --- a/book/content/part01/big-o-examples.asc +++ b/book/content/part01/big-o-examples.asc @@ -5,7 +5,7 @@ endif::[] === Big O examples -There are many kinds of algorithms. Most of them fall into one of the eight of the time complexities that we are going to explore in this chapter. +There are many kinds of algorithms. Most of them fall into one of the eight time complexities that we are going to explore in this chapter. .Eight Running Time complexity You Should Know - Constant time: _O(1)_ @@ -47,7 +47,7 @@ include::{codedir}/runtimes/01-is-empty.js[tag=isEmpty] Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. -As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performance than this! +As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performant than this! [[logarithmic]] ==== Logarithmic @@ -68,7 +68,7 @@ The binary search only works for sorted lists. It starts searching for an elemen include::{codedir}/runtimes/02-binary-search.js[tag=binarySearchRecursive] ---- -This binary search implementation is a recursive algorithm, which means that the function `binarySearch` calls itself multiple times until the solution is found. The binary search split the array in half every time. +This binary search implementation is a recursive algorithm, which means that the function `binarySearch` calls itself multiple times until the solution is found. The binary search splits the array in half every time. Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. @@ -134,7 +134,7 @@ The merge function combines two sorted arrays in ascending order. Let’s say th .Mergesort visualization. Shows the split, sort and merge steps image::image11.png[Mergesort visualization,width=500,height=600] -How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work we have *O(n log n)*. There more formal ways to reach to this runtime like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. +How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work is *O(n log n)*. There are more formal ways to reach this runtime, like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. [[quadratic]] ==== Quadratic @@ -142,7 +142,7 @@ How do we obtain the running time of the merge sort algorithm? The mergesort div (((Runtime, Quadratic))) Running times that are quadratic, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. -Usually, they have double-nested loops that where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. +Usually they have double-nested loops, where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. [[quadratic-example]] ===== Finding duplicates in an array (naïve approach) @@ -157,7 +157,7 @@ If you remember we have solved this problem more efficiently on the <> you will get the answer in seconds! [big]#🚀# @@ -165,7 +165,7 @@ Let’s say you want to find a duplicated middle name in a phone directory book ==== Cubic (((Cubic))) (((Runtime, Cubic))) -Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. As an example of a cubic algorithm is a multi-variable equation solver (using brute force): +Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. An example of a cubic algorithm is a multi-variable equation solver (using brute force): [[cubic-example]] ===== Solving a multi-variable equation @@ -184,15 +184,15 @@ A naïve approach to solve this will be the following program: include::{codedir}/runtimes/06-multi-variable-equation-solver.js[tag=findXYZ] ---- -WARNING: This just an example, there are better ways to solve multi-variable equations. +WARNING: This is just an example, there are better ways to solve multi-variable equations. -As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we can refer as a *polynomial runtime*. +As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we refer to this as a *polynomial runtime*. [[exponential]] ==== Exponential (((Exponential))) (((Runtime, Exponential))) -Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish on your lifetime. [big]#💀# +Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish in your lifetime. [big]#💀# Let’s do an example. @@ -251,7 +251,7 @@ include::{codedir}/runtimes/08-permutations.js[tag=snippet] As you can see in the `getPermutations` function, the resulting array is the factorial of the word length. -Factorial start very slow and then it quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! +Factorial starts very slow, and quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! [big]*🤯* ==== Summary diff --git a/package-lock.json b/package-lock.json index 79c75fba..1b15347b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.2", + "version": "1.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { From 69afe33713f0a6686d2f9621d05030a26876437e Mon Sep 17 00:00:00 2001 From: Archana Kumari <32739028+archanaserver@users.noreply.github.com> Date: Sat, 17 Aug 2019 00:39:06 +0530 Subject: [PATCH 018/200] change the stable properties Quick Sort is always unstable because of the relative order of records in the case of an equality of keys. --- book/content/part04/quick-sort.asc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/content/part04/quick-sort.asc b/book/content/part04/quick-sort.asc index 0e856679..ad2dfdbb 100644 --- a/book/content/part04/quick-sort.asc +++ b/book/content/part04/quick-sort.asc @@ -77,7 +77,7 @@ With the optimization, Quicksort has an _O(n log n)_ running time. Similar to th ===== Quicksort Properties -- <>: [big]#✅# Yes +- <>: [big]#❌# No - <>: [big]#✅# Yes - <>: [big]#️❌# No, mostly sorted array takes the same time O(n log n). - <>: [big]#️❌# No, the pivot element can be choose at random. From 98f0dfbea92e13c9da98f53fe1cb3a1e9b58b2ff Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 16 Aug 2019 18:24:43 -0400 Subject: [PATCH 019/200] release: 1.3.4 --- CHANGELOG.md | 14 +++++++++++++- README.md | 2 +- notes.md | 6 +++--- package.json | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa14fdbd..8a67bdf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.4] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- fix(queue): runtime error [commit](https://github.com/amejiarosario/dsa.js/commit/fd3ab480f2bb7cc2b7ce45da4e6a41831eafb7bf) +- fix(book): remove lorem ipsum [commit](https://github.com/amejiarosario/dsa.js/commit/6a06e3b75915a72ef0dd5ee9d37dcf434c4c8e18) +- docs(book): improve grammar + ## [1.2.3] ### Breaking Changes (major) @@ -86,7 +97,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.2.3...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...HEAD +[1.3.4]: https://github.com/amejiarosario/dsa.js/compare/1.2.3...1.3.4 [1.2.2]: https://github.com/amejiarosario/dsa.js/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/amejiarosario/dsa.js/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/amejiarosario/dsa.js/compare/1.2.0...1.2.1 diff --git a/README.md b/README.md index 05525b07..3d4c5d72 100644 --- a/README.md +++ b/README.md @@ -511,4 +511,4 @@ Reach out to me at one of the following places! [![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](LICENSE) -![](http://app.uxeranalytics.com/image1.png?uxa=github-dsajs) +![](https://data.uxeranalytics.com/image1.png?uxa=github-dsajs) diff --git a/notes.md b/notes.md index b7133c11..a353e9a2 100644 --- a/notes.md +++ b/notes.md @@ -22,9 +22,9 @@ git log HEAD --pretty=format:%s # example git log 1.1.0..HEAD --pretty=format:%s -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" +git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" +git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" +git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" ``` New features in this release diff --git a/package.json b/package.json index af9df95a..2dae27e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.3", + "version": "1.3.4", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From b5aae35484404bd28142d5533d96f0799f0ef352 Mon Sep 17 00:00:00 2001 From: gerasimov Date: Tue, 20 Aug 2019 01:40:51 +0400 Subject: [PATCH 020/200] fix typo --- book/content/part02/queue.asc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 626d7417..62d50ff2 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -77,7 +77,7 @@ As an experiment, we can see in the following table that if we had implemented t .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ | Queue (w/array) ^|- ^|- ^|- ^|- ^|O(1) ^|*O(n)* ^|- ^|- ^|O(n) -| Queue (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| Queue (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|O(1) ^|- ^|- ^|O(n) |=== // end::table[] indexterm:[Runtime, Linear] From 1fa93415a6e14acc24e90443b2e9bdf053c4c983 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 23 Aug 2019 16:17:21 -0400 Subject: [PATCH 021/200] fix(tree-rotations): prevent losing nodes LL Rotation, lose the newParent previous right node; RR Rotation too Fixes: #30 --- src/data-structures/trees/avl-tree.spec.js | 19 ++++++ src/data-structures/trees/tree-rotations.js | 65 +++++++++++++------ .../trees/tree-rotations.spec.js | 63 +++++++++++++++++- 3 files changed, 125 insertions(+), 22 deletions(-) diff --git a/src/data-structures/trees/avl-tree.spec.js b/src/data-structures/trees/avl-tree.spec.js index de25a0b1..db049bbe 100644 --- a/src/data-structures/trees/avl-tree.spec.js +++ b/src/data-structures/trees/avl-tree.spec.js @@ -144,4 +144,23 @@ describe('AvlTree', () => { expect(tree.root).toBe(n); }); }); + + describe('balance without loosing nodes', () => { + beforeEach(() => { + tree.add(16); + tree.add(4); + tree.add(32); + tree.add(8); + tree.add(2); + }); + + it('should have all nodes', () => { + expect(tree.toArray()).toEqual([16, 4, 32, 2, 8, null, null, null, null, null, null]); + }); + + it('should rebalance and keep all nodes', () => { + tree.add(1); + expect(tree.toArray()).toEqual([4, 2, 16, 1, null, 8, 32, null, null, null, null, null, null]); + }); + }); }); diff --git a/src/data-structures/trees/tree-rotations.js b/src/data-structures/trees/tree-rotations.js index 8f2c6338..235c3691 100644 --- a/src/data-structures/trees/tree-rotations.js +++ b/src/data-structures/trees/tree-rotations.js @@ -2,7 +2,6 @@ /** * Swap parent's child * - * * @example Child on the left side (it also work for the right side) * * p = parent @@ -34,7 +33,7 @@ function swapParentChild(oldChild, newChild, parent) { /** * Single Left Rotation (LL Rotation) * - * @example: tree with values 1-2-3-4 + * @example: #1 tree with values 1-2-3-4 * * 1 1 * \ \ @@ -43,21 +42,34 @@ function swapParentChild(oldChild, newChild, parent) { * 3 2* 4 * \ * 4 - * @param {TreeNode} node - * @returns {TreeNode} new parent after the rotation + * + * @example: #2 left rotation + * + * 1 1 + * \ \ + * 4* 16 + * / \ / \ + * 2 16 -- left-rotation(4) -> 4 32 + * / \ / \ \ + * 8 32 2 8 64 + * \ + * 64 + * @param {TreeNode} node current node to rotate (e.g. 4) + * @returns {TreeNode} new parent after the rotation (e.g. 16) */ function leftRotation(node) { - const newParent = node.right; // E.g., node 3 + const newParent = node.right; // E.g., node 16 const grandparent = node.parent; // E.g., node 1 + const previousLeft = newParent.left; // E.g., node 8 - // swap node 1 left child from 2 to 3. + // swap parent of node 4 from node 1 to node 16 swapParentChild(node, newParent, grandparent); - // Update node 3 left child to be 2, and - // updates node 2 parent to be node 3 (instead of 1). + // Update node 16 left child to be 4, and + // updates node 4 parent to be node 16 (instead of 1). newParent.setLeftAndUpdateParent(node); - // remove node 2 left child (previouly was node 3) - node.setRightAndUpdateParent(null); + // set node4 right child to be previousLeft (node 8) + node.setRightAndUpdateParent(previousLeft); return newParent; } @@ -66,8 +78,7 @@ function leftRotation(node) { // tag::rightRotation[] /** * Single Right Rotation (RR Rotation) - * - * @example rotate node 3 to the right +* @example: #1 rotate node 3 to the right * * 4 4 * / / @@ -77,22 +88,34 @@ function leftRotation(node) { * / * 1 * + * @example: #2 rotate 16 to the right and preserve nodes + * 64 64 + * / / + * 16* 4 + * / \ / \ + * 4 32 -- right-rotation(16) --> 2 16 + * / \ / / \ + * 2 8 1 8 32 + * / + * 1 + * * @param {TreeNode} node - * this is the node we want to rotate to the right. (E.g., node 3) - * @returns {TreeNode} new parent after the rotation (E.g., node 2) + * this is the node we want to rotate to the right. (E.g., node 16) + * @returns {TreeNode} new parent after the rotation (E.g., node 4) */ function rightRotation(node) { - const newParent = node.left; // E.g., node 2 - const grandparent = node.parent; // E.g., node 4 + const newParent = node.left; // E.g., node 4 + const grandparent = node.parent; // E.g., node 64 + const previousRight = newParent.right; // E.g., node 8 - // swap node 4 left children (node 3) with node 2. + // swap node 64's left children (node 16) with node 4 (newParent). swapParentChild(node, newParent, grandparent); - // update right child on node 2 to be node 3, - // also make node 2 the new parent of node 3. + // update node 4's right child to be node 16, + // also make node 4 the new parent of node 16. newParent.setRightAndUpdateParent(node); - // remove node 3 left child (so it doesn't point to node 2) - node.setLeftAndUpdateParent(null); + // Update 16's left child to be the `previousRight` node. + node.setLeftAndUpdateParent(previousRight); return newParent; } diff --git a/src/data-structures/trees/tree-rotations.spec.js b/src/data-structures/trees/tree-rotations.spec.js index bb02039f..3a826532 100644 --- a/src/data-structures/trees/tree-rotations.spec.js +++ b/src/data-structures/trees/tree-rotations.spec.js @@ -96,6 +96,39 @@ describe('Tree rotations', () => { value: 3, left: 2, right: null, parent: 4, }); }); + + it('should not lose nodes on LL', () => { + // 1 1 + // \ \ + // 4* 16 + // / \ / \ + // 2 16 -- left-rotation(4) -> 4 32 + // / \ / \ \ + // 8 32 2 8 64 + // \ + // 64 + const n8 = new BinaryTreeNode(8); + const n16 = new BinaryTreeNode(16); + const n32 = new BinaryTreeNode(32); + const n64 = new BinaryTreeNode(64); + + n1.setRightAndUpdateParent(n4); + n4.setLeftAndUpdateParent(n2); + n4.setRightAndUpdateParent(n16); + n16.setLeftAndUpdateParent(n8); + n16.setRightAndUpdateParent(n32); + n32.setLeftAndUpdateParent(n64); + + const newParent = leftRotation(n4); + + expect(newParent).toBe(n16); + expect(n8.toValues()).toMatchObject({ + value: 8, left: null, right: null, parent: 4, + }); + expect(n4.toValues()).toMatchObject({ + value: 4, left: 2, right: 8, parent: 16, + }); + }); }); describe('#rightRotation (RR Rotation)', () => { @@ -145,7 +178,7 @@ describe('Tree rotations', () => { }); }); - it('should last two', () => { + it('should RR last two', () => { // 1 // \ // 3* @@ -167,6 +200,34 @@ describe('Tree rotations', () => { value: 3, left: null, right: null, parent: 2, }); }); + + it('should not lose nodes on RR', () => { + // 16* 4 + // / \ / \ + // 4 32 -- right-rotation(16) --> 2 16 + // / \ / / \ + // 2 8 1 8 32 + // / + // 1 + const n8 = new BinaryTreeNode(8); + const n16 = new BinaryTreeNode(16); + const n32 = new BinaryTreeNode(32); + n16.setLeftAndUpdateParent(n4); + n16.setRightAndUpdateParent(n32); + n4.setLeftAndUpdateParent(n2); + n4.setRightAndUpdateParent(n8); + n2.setLeftAndUpdateParent(n1); + + const newParent = rightRotation(n16); + + expect(newParent).toBe(n4); + expect(n8.toValues()).toMatchObject({ + value: 8, left: null, right: null, parent: 16, + }); + expect(n16.toValues()).toMatchObject({ + value: 16, left: 8, right: 32, parent: 4, + }); + }); }); describe('#leftRightRotation (LR Rotation)', () => { From ebb7be80433e940f22a6f2f5ebbe26ea2c33b64b Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 23 Aug 2019 16:28:53 -0400 Subject: [PATCH 022/200] release: 1.3.5 --- CHANGELOG.md | 12 +++++++++++- notes.md | 6 +++--- package.json | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a67bdf9..6c572d7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.5] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- fix(tree-rotations): prevent losing nodes [commit](https://github.com/amejiarosario/dsa.js/commit/1fa93415a6e14acc24e90443b2e9bdf053c4c983) + ## [1.3.4] ### Breaking Changes (major) @@ -97,7 +106,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...HEAD +[1.3.5]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...1.3.5 [1.3.4]: https://github.com/amejiarosario/dsa.js/compare/1.2.3...1.3.4 [1.2.2]: https://github.com/amejiarosario/dsa.js/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/amejiarosario/dsa.js/compare/1.2.1...1.2.2 diff --git a/notes.md b/notes.md index a353e9a2..4cc5c330 100644 --- a/notes.md +++ b/notes.md @@ -22,9 +22,9 @@ git log HEAD --pretty=format:%s # example git log 1.1.0..HEAD --pretty=format:%s -git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" -git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" -git log 1.2.3..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" +git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" +git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" +git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" ``` New features in this release diff --git a/package.json b/package.json index 2dae27e0..0840b6cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.4", + "version": "1.3.5", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 72e3d68e09bb9c7dd3fabf5cbeba1ae5571fc686 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 23 Aug 2019 17:10:52 -0400 Subject: [PATCH 023/200] style: fix eslint issue --- .vscode/settings.json | 13 +++++++++++-- src/data-structures/trees/avl-tree.spec.js | 6 ++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2f829e08..035ef5b2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,17 @@ { "workbench.colorCustomizations": { + "activityBar.background": "#fbed80", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#06b9a5", + "activityBarBadge.foreground": "#15202b", "titleBar.activeBackground": "#f9e64f", "titleBar.inactiveBackground": "#f9e64f99", "titleBar.activeForeground": "#15202b", - "titleBar.inactiveForeground": "#15202b99" - } + "titleBar.inactiveForeground": "#15202b99", + "statusBar.background": "#f9e64f", + "statusBarItem.hoverBackground": "#f7df1e", + "statusBar.foreground": "#15202b" + }, + "peacock.color": "#f9e64f" } diff --git a/src/data-structures/trees/avl-tree.spec.js b/src/data-structures/trees/avl-tree.spec.js index db049bbe..a0c79d34 100644 --- a/src/data-structures/trees/avl-tree.spec.js +++ b/src/data-structures/trees/avl-tree.spec.js @@ -155,12 +155,14 @@ describe('AvlTree', () => { }); it('should have all nodes', () => { - expect(tree.toArray()).toEqual([16, 4, 32, 2, 8, null, null, null, null, null, null]); + expect(tree.toArray()).toEqual([16, 4, 32, 2, 8, + null, null, null, null, null, null]); }); it('should rebalance and keep all nodes', () => { tree.add(1); - expect(tree.toArray()).toEqual([4, 2, 16, 1, null, 8, 32, null, null, null, null, null, null]); + expect(tree.toArray()).toEqual([4, 2, 16, 1, null, 8, 32, + null, null, null, null, null, null]); }); }); }); From d8ce2f5b1a3bfeb861928d6c99d7624cd9ac144a Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 23 Aug 2019 17:18:04 -0400 Subject: [PATCH 024/200] update deps --- package-lock.json | 52 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 4 +--- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b15347b..8a1134da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.3", + "version": "1.3.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -3967,6 +3967,15 @@ "tmpl": "1.0.x" } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3989,12 +3998,22 @@ "dev": true }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } } }, "merge": { @@ -4461,6 +4480,17 @@ "execa": "^0.7.0", "lcid": "^1.0.0", "mem": "^1.1.0" + }, + "dependencies": { + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + } } }, "os-tmpdir": { @@ -4469,12 +4499,24 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", diff --git a/package.json b/package.json index 0840b6cf..b6933d1a 100644 --- a/package.json +++ b/package.json @@ -31,17 +31,15 @@ "dependencies": {}, "devDependencies": { "benchmark": "2.1.4", - "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", - "jest": "23.6.0", "braces": ">=2.3.1", "handlebars": ">=4.0.14", "js-yaml": ">=3.13.1", - + "mem": ">=4.0.0", "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { From 8096f7c6dda24de47b54cead9882fbc18e99a583 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 23 Aug 2019 17:20:38 -0400 Subject: [PATCH 025/200] release: 1.3.6 --- CHANGELOG.md | 13 ++++++++++++- package.json | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c572d7f..5139f383 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.6] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- update deps [commit](https://github.com/amejiarosario/dsa.js/commit/d8ce2f5b1a3bfeb861928d6c99d7624cd9ac144a) +- style: fix eslint issue [commit](https://github.com/amejiarosario/dsa.js/commit/72e3d68e09bb9c7dd3fabf5cbeba1ae5571fc686)% + ## [1.3.5] ### Breaking Changes (major) @@ -106,7 +116,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.6...HEAD +[1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...1.3.6 [1.3.5]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...1.3.5 [1.3.4]: https://github.com/amejiarosario/dsa.js/compare/1.2.3...1.3.4 [1.2.2]: https://github.com/amejiarosario/dsa.js/compare/1.2.2...1.2.3 diff --git a/package.json b/package.json index b6933d1a..4d6382da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.5", + "version": "1.3.6", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 98e2c037f05caf37731da1dc50dd8867a1804c0e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 27 Aug 2019 15:05:28 -0400 Subject: [PATCH 026/200] fix(avl-tree): balance was not working properly Fixes: #33 --- src/data-structures/trees/avl-tree.js | 16 +++--- src/data-structures/trees/avl-tree.spec.js | 61 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/data-structures/trees/avl-tree.js b/src/data-structures/trees/avl-tree.js index 573095bd..272a16e1 100644 --- a/src/data-structures/trees/avl-tree.js +++ b/src/data-structures/trees/avl-tree.js @@ -17,23 +17,21 @@ const { * - LR rotations: double rotation left-right * - RL rotations: double rotation right-left * - * @param {TreeNode} node + * @param {BinaryTreeNode} node */ function balance(node) { if (node.balanceFactor > 1) { // left subtree is higher than right subtree - if (node.left.balanceFactor > 0) { - return rightRotation(node); - } if (node.left.balanceFactor < 0) { + if (node.left.balanceFactor < 0) { return leftRightRotation(node); } - } else if (node.balanceFactor < -1) { + return rightRotation(node); + } if (node.balanceFactor < -1) { // right subtree is higher than left subtree - if (node.right.balanceFactor < 0) { - return leftRotation(node); - } if (node.right.balanceFactor > 0) { + if (node.right.balanceFactor > 0) { return rightLeftRotation(node); } + return leftRotation(node); } return node; } @@ -43,7 +41,7 @@ function balance(node) { /** * Bubbles up balancing nodes a their parents * - * @param {TreeNode} node + * @param {BinaryTreeNode} node */ function balanceUpstream(node) { let current = node; diff --git a/src/data-structures/trees/avl-tree.spec.js b/src/data-structures/trees/avl-tree.spec.js index a0c79d34..af831cdc 100644 --- a/src/data-structures/trees/avl-tree.spec.js +++ b/src/data-structures/trees/avl-tree.spec.js @@ -165,4 +165,65 @@ describe('AvlTree', () => { null, null, null, null, null, null]); }); }); + + describe('balancing to the left', () => { + let n32; + beforeEach(() => { + n32 = tree.add(32); + tree.add(8); + tree.add(64); + tree.add(4); + tree.add(16); + tree.add(48); + tree.add(128); + tree.add(2); + tree.add(6); + tree.add(10); + tree.add(20); + }); + + it('should have all nodes', () => { + expect(tree.toArray()).toEqual([32, 8, 64, 4, 16, 48, 128, 2, 6, 10, 20, + null, null, null, null, null, null, null, null, null, null, null, null]); + }); + + it('should rebalance when removing', () => { + tree.remove(64); + expect(tree.toArray()).toEqual([32, 8, 128, 4, 16, 48, null, 2, 6, 10, 20, + null, null, null, null, null, null, null, null, null, null]); + expect(n32.balanceFactor).toBe(1); + expect(n32.right.balanceFactor).toBe(1); + expect(n32.left.balanceFactor).toBe(0); + + tree.remove(48); + expect(tree.toArray()).toEqual([8, 4, 32, 2, 6, 16, 128, null, null, null, null, 10, 20, + null, null, null, null, null, null]); + }); + }); + + describe('balancing to the right', () => { + beforeEach(() => { + tree.add(8); + tree.add(4); + tree.add(32); + tree.add(2); + tree.add(16); + tree.add(64); + tree.add(10); + tree.add(20); + tree.add(60); + tree.add(70); + }); + + it('should build the tree', () => { + expect(tree.toArray()).toEqual([8, 4, 32, 2, null, 16, 64, null, null, 10, 20, 60, 70, + null, null, null, null, null, null, null, null]); + }); + + it('should rebalance right side', () => { + tree.remove(2); + expect(tree.toArray()).toEqual([32, 8, 64, 4, 16, 60, 70, null, null, 10, 20, + null, null, null, null, null, null, null, null]); + }); + }); }); From 01ad65ddd89ffb11de1da77fa86f74fdf6f7ba80 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 27 Aug 2019 15:08:59 -0400 Subject: [PATCH 027/200] release: 1.3.7 --- CHANGELOG.md | 14 ++++++++++++-- notes.md | 6 +++--- package.json | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5139f383..23e12bd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.7] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- fix(avl-tree): balance was not working properly [commit](https://github.com/amejiarosario/dsa.js/commit/98e2c037f05caf37731da1dc50dd8867a1804c0e) + ## [1.3.6] ### Breaking Changes (major) @@ -21,7 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) - update deps [commit](https://github.com/amejiarosario/dsa.js/commit/d8ce2f5b1a3bfeb861928d6c99d7624cd9ac144a) -- style: fix eslint issue [commit](https://github.com/amejiarosario/dsa.js/commit/72e3d68e09bb9c7dd3fabf5cbeba1ae5571fc686)% +- style: fix eslint issue [commit](https://github.com/amejiarosario/dsa.js/commit/72e3d68e09bb9c7dd3fabf5cbeba1ae5571fc686) ## [1.3.5] @@ -116,7 +125,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.6...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.7...HEAD +[1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.6...1.3.7 [1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...1.3.6 [1.3.5]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...1.3.5 [1.3.4]: https://github.com/amejiarosario/dsa.js/compare/1.2.3...1.3.4 diff --git a/notes.md b/notes.md index 4cc5c330..2f927d2b 100644 --- a/notes.md +++ b/notes.md @@ -22,9 +22,9 @@ git log HEAD --pretty=format:%s # example git log 1.1.0..HEAD --pretty=format:%s -git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" -git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" -git log 1.3.4..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" +git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" +git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" +git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" ``` New features in this release diff --git a/package.json b/package.json index 4d6382da..ad911a4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.6", + "version": "1.3.7", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 2f202c13a93dd057931e67fd1c555ba118b05db3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 15 Oct 2019 15:34:53 -0400 Subject: [PATCH 028/200] fix yml file --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index c685c664..4a1adb60 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,5 @@ # These are supported funding model platforms -github: amejiarosario # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +# github: amejiarosario # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: amejiarosario # Replace with a single Patreon username custom: https://adrianmejia.com/support/ # Replace with a single custom sponsorship URL From c57cbfdc2eacee69a790a656eb9754fc575e7099 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 17 Oct 2019 11:31:54 -0400 Subject: [PATCH 029/200] Update yaml file --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 4a1adb60..c685c664 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,5 @@ # These are supported funding model platforms -# github: amejiarosario # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: amejiarosario # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: amejiarosario # Replace with a single Patreon username custom: https://adrianmejia.com/support/ # Replace with a single custom sponsorship URL From 06ef72a587fbb678ede261b50b95f1b1846b2c8c Mon Sep 17 00:00:00 2001 From: Apoorva Bhagat <36542307+bhagatapoorva@users.noreply.github.com> Date: Thu, 31 Oct 2019 23:21:22 +0530 Subject: [PATCH 030/200] Update README.md More about algorithms. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d4c5d72..301c85fc 100644 --- a/README.md +++ b/README.md @@ -226,11 +226,13 @@ they take different time to complete. Use Arrays when… - You need to access data in random order fast (using an index). - Your data is multi-dimensional (e.g., matrix, tensor). +- when there is a limit on memory as the requirement of memory is less due to actual data being stored within the index in the array. Use Linked Lists when: - You will access your data sequentially. - You want to save memory and only allocate memory as you need it. - You want constant time to remove/add from extremes of the list. +- when size requirement is unknown - dynamic size advantage --- @@ -394,7 +396,7 @@ From unbalanced BST to balanced BST --- -#### [Never get stuck solving a problem with 7 simple steps](book/part04-algorithmic-toolbox.asc) +#### [Never get stuck solving a problem with 8 simple steps](book/part04-algorithmic-toolbox.asc) 1. Understand the problem 1. Build a simple example (no edge cases yet) @@ -403,6 +405,7 @@ From unbalanced BST to balanced BST 1. Optimize the solution 1. Write Code, yes, now you can code. 1. Test your written code +1. Analyse the complexity, both space and time and make sure to optimise further. Full details [here](book/part04-algorithmic-toolbox.asc) From f625d93b91bbf75b1fc420a99eb99370602a6558 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 25 Nov 2019 19:49:01 -0500 Subject: [PATCH 031/200] add examples --- package-lock.json | 1780 +++++++++++++------------ src/algorithms/get-min.js | 16 + src/algorithms/get-min.spec.js | 19 + src/runtimes/02-binary-search.js | 2 +- src/runtimes/02-binary-search.spec.js | 29 + 5 files changed, 1006 insertions(+), 840 deletions(-) create mode 100644 src/algorithms/get-min.js create mode 100644 src/algorithms/get-min.spec.js create mode 100644 src/runtimes/02-binary-search.spec.js diff --git a/package-lock.json b/package-lock.json index 8a1134da..4e776f5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "dsa.js", - "version": "1.3.5", + "version": "1.3.7", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -33,21 +33,21 @@ } }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", + "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", "dev": true }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -55,9 +55,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.1.tgz", - "integrity": "sha512-SiwgrRuRD2D1R6qjwwoopKcCTkmmIWjy1M15Wv+Nk/7VUsBad4P8GOPft2t6coDZG0TuR5dq9o1v0g8wo7F6+A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true } } @@ -80,9 +80,9 @@ } }, "acorn-walk": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.0.1.tgz", - "integrity": "sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { @@ -104,9 +104,9 @@ "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -116,13 +116,10 @@ "dev": true }, "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "anymatch": { "version": "2.0.0", @@ -175,6 +172,15 @@ } } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -407,6 +413,22 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -455,21 +477,16 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -483,12 +500,12 @@ "dev": true }, "asciidoctor.js": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.6.tgz", - "integrity": "sha512-GFBpOZiRih8jW8HEqlwU6ywUOE0XHso1cPTG/4YtNbR+0DxZ9H3aQ7JMTBeSsc82pIiUR9MtWXAHIZ6L3IOeFg==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", + "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", "dev": true, "requires": { - "opal-runtime": "1.0.3" + "opal-runtime": "1.0.11" } }, "asn1": { @@ -519,18 +536,18 @@ "dev": true }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.14" } }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -568,12 +585,6 @@ "js-tokens": "^3.0.2" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -595,12 +606,6 @@ "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", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, @@ -629,6 +634,29 @@ "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "babel-generator": { @@ -645,6 +673,14 @@ "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "babel-helpers": { @@ -763,6 +799,29 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-types": { @@ -861,7 +920,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -896,9 +954,9 @@ } }, "browser-process-hrtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", "dev": true }, "browser-resolve": { @@ -908,27 +966,29 @@ "dev": true, "requires": { "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "cache-base": { @@ -963,20 +1023,12 @@ "dev": true, "requires": { "callsites": "^0.2.0" - }, - "dependencies": { - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - } } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "camelcase": { @@ -1001,14 +1053,34 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "chardet": { @@ -1018,9 +1090,9 @@ "dev": true }, "ci-info": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", - "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, "circular-json": { @@ -1107,12 +1179,12 @@ } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -1122,25 +1194,25 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "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==", "dev": true, "optional": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -1161,6 +1233,12 @@ "typedarray": "^0.0.6" } }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", @@ -1183,9 +1261,9 @@ "dev": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true }, "core-util-is": { @@ -1206,15 +1284,15 @@ } }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1230,20 +1308,20 @@ } }, "data-urls": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", - "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { "abab": "^2.0.0", - "whatwg-mimetype": "^2.1.0", + "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" }, "dependencies": { "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -1254,12 +1332,12 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -1287,6 +1365,17 @@ "dev": true, "requires": { "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } } }, "define-properties": { @@ -1351,21 +1440,6 @@ } } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1416,43 +1490,56 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "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==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" } }, "escape-string-regexp": { @@ -1462,9 +1549,9 @@ "dev": true }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -1479,13 +1566,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, @@ -1533,34 +1613,17 @@ "strip-json-comments": "~2.0.1", "table": "4.0.2", "text-table": "~0.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", - "dev": true - } } }, "eslint-config-airbnb-base": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", - "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", + "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", "dev": true, "requires": { - "eslint-restricted-globals": "^0.1.1", + "confusing-browser-globals": "^1.0.5", "object.assign": "^4.1.0", - "object.entries": "^1.0.4" + "object.entries": "^1.1.0" } }, "eslint-import-resolver-node": { @@ -1573,51 +1636,78 @@ "resolve": "^1.5.0" }, "dependencies": { - "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==", - "dev": true - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { "debug": "^2.6.8", "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.11.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1628,76 +1718,10 @@ "isarray": "^1.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } @@ -1708,16 +1732,10 @@ "integrity": "sha512-kB0gaMLy4RA1bAltYSnnoW33hzX0bUrALGaIqaLoB41Fif38/uAv6oNUFbrzp7aFrwegxKUgFcE/8Z0DZEa0SQ==", "dev": true }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", - "dev": true - }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1725,9 +1743,9 @@ } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { @@ -1765,15 +1783,15 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { @@ -1786,19 +1804,34 @@ } }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - } + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } }, "exit": { "version": "0.1.2", @@ -1860,6 +1893,17 @@ "jest-matcher-utils": "^23.6.0", "jest-message-util": "^23.4.0", "jest-regex-util": "^23.3.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } } }, "extend": { @@ -1984,17 +2028,6 @@ "dev": true, "requires": { "to-regex-range": "^5.0.1" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, "find-up": { @@ -2007,14 +2040,14 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -2040,13 +2073,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -2066,14 +2099,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -2085,8 +2118,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2095,7 +2127,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -2107,21 +2139,19 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -2129,20 +2159,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2151,16 +2178,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2209,7 +2236,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -2229,12 +2256,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2259,8 +2286,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2272,7 +2298,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2287,7 +2312,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2295,21 +2319,19 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -2321,41 +2343,40 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -2372,13 +2393,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -2402,8 +2423,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2415,7 +2435,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2455,12 +2474,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -2490,19 +2509,18 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2517,7 +2535,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -2538,7 +2556,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2558,7 +2575,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2570,17 +2586,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -2591,25 +2607,23 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -2632,10 +2646,13 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "get-value": { "version": "2.0.6", @@ -2653,9 +2670,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2686,29 +2703,15 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { @@ -2718,23 +2721,15 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", + "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", "dev": true, "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "har-schema": { @@ -2744,22 +2739,48 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "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==", + "dev": true + } } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2854,9 +2875,9 @@ } }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, "html-encoding-sniffer": { @@ -2880,15 +2901,18 @@ } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "import-local": { @@ -2918,9 +2942,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "inquirer": { @@ -2955,9 +2979,9 @@ } }, "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-accessor-descriptor": { @@ -2981,15 +3005,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -3102,30 +3117,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3183,10 +3174,13 @@ "dev": true }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -3206,6 +3200,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3324,19 +3324,10 @@ "source-map": "^0.5.3" }, "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } @@ -3618,16 +3609,10 @@ "throat": "^4.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3663,14 +3648,6 @@ "strip-bom": "3.0.0", "write-file-atomic": "^2.1.0", "yargs": "^11.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } } }, "jest-serializer": { @@ -3713,10 +3690,10 @@ "source-map": "^0.6.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true } } @@ -3773,8 +3750,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsdom": { "version": "11.12.0", @@ -3874,12 +3850,12 @@ "dev": true }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "left-pad": { @@ -3905,16 +3881,15 @@ } }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -3928,9 +3903,9 @@ } }, "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -3949,9 +3924,9 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4017,9 +3992,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "merge-stream": { @@ -4066,18 +4041,18 @@ } }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -4102,9 +4077,9 @@ "dev": true }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -4132,9 +4107,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { @@ -4144,9 +4119,9 @@ "dev": true }, "nan": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, "optional": true }, @@ -4201,6 +4176,12 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4208,25 +4189,26 @@ "dev": true }, "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", - "semver": "^5.4.1", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "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==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -4256,9 +4238,9 @@ "dev": true }, "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "oauth-sign": { @@ -4295,10 +4277,16 @@ } } }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -4340,17 +4328,6 @@ "es-abstract": "^1.12.0", "function-bind": "^1.1.1", "has": "^1.0.3" - }, - "dependencies": { - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - } } }, "object.getownpropertydescriptors": { @@ -4390,6 +4367,18 @@ } } }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4409,9 +4398,9 @@ } }, "opal-runtime": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.3.tgz", - "integrity": "sha512-bUcaUjep2qZ1GnctgvQ8AsgQ+U0/uu4vaDDLIkkj6Hk4RxfgKW+qaHE0Kd6WPTBcIy/sjjy8zgDYsRMkYMIi4g==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", + "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", "dev": true, "requires": { "glob": "6.0.4", @@ -4441,6 +4430,14 @@ "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } } }, "optionator": { @@ -4455,14 +4452,6 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "os-homedir": { @@ -4472,24 +4461,32 @@ "dev": true }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" }, "dependencies": { "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true } } }, @@ -4518,9 +4515,9 @@ "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -4599,20 +4596,18 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pify": "^2.0.0" } }, "performance-now": { @@ -4702,6 +4697,15 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } } } }, @@ -4712,15 +4716,15 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "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==", "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "prompts": { @@ -4740,11 +4744,21 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -4783,45 +4797,24 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^2.0.0" } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -4840,9 +4833,9 @@ } }, "realpath-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", - "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -4932,26 +4925,44 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -4974,21 +4985,16 @@ "requires": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } } }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } }, "resolve-cwd": { "version": "2.0.0", @@ -4997,12 +5003,20 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, "resolve-url": { @@ -5028,12 +5042,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "rsvp": { @@ -5145,6 +5159,15 @@ } } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -5383,6 +5406,22 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -5393,9 +5432,9 @@ "dev": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -5405,9 +5444,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -5491,6 +5530,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -5508,6 +5556,18 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -5584,9 +5644,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-resolve": { @@ -5609,6 +5669,14 @@ "dev": true, "requires": { "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "source-map-url": { @@ -5618,9 +5686,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5628,9 +5696,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -5644,9 +5712,9 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -5665,9 +5733,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -5682,9 +5750,9 @@ } }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "static-extend": { @@ -5734,6 +5802,26 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5761,13 +5849,10 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -5782,18 +5867,15 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "table": { @@ -5821,6 +5903,81 @@ "object-assign": "^4.1.0", "read-pkg-up": "^1.0.1", "require-main-filename": "^1.0.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } } }, "text-table": { @@ -5893,42 +6050,22 @@ } }, "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=", + "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==", "dev": true, "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } + "is-number": "^7.0.0" } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { @@ -5959,8 +6096,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -5978,58 +6114,26 @@ "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.5.tgz", + "integrity": "sha512-7L3W+Npia1OCr5Blp4/Vw83tK1mu5gnoIURtT1fUVfQ3Kf8WStWV6NJz0fdoBJZls0KlweruRTLVe6XLafmy5g==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "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==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unset-value": { @@ -6078,6 +6182,15 @@ } } }, + "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==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -6107,15 +6220,15 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "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==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -6176,29 +6289,18 @@ "dev": true }, "whatwg-encoding": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", - "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { - "iconv-lite": "0.4.23" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "iconv-lite": "0.4.24" } }, "whatwg-mimetype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", - "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { @@ -6228,9 +6330,9 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { @@ -6290,9 +6392,9 @@ } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -6334,16 +6436,16 @@ "dev": true }, "yargs": { - "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", diff --git a/src/algorithms/get-min.js b/src/algorithms/get-min.js new file mode 100644 index 00000000..f798084e --- /dev/null +++ b/src/algorithms/get-min.js @@ -0,0 +1,16 @@ +/** + * Get the smallest number on an array of numbers + * @param {Array} n array of numbers + */ +function getMin(n = []) { + let min = n[0]; + + n.forEach(element => { + if(element < min) { + min = element; + } + }); + return min; +} + +module.exports = getMin; \ No newline at end of file diff --git a/src/algorithms/get-min.spec.js b/src/algorithms/get-min.spec.js new file mode 100644 index 00000000..517a3673 --- /dev/null +++ b/src/algorithms/get-min.spec.js @@ -0,0 +1,19 @@ +const getMin = require('./get-min'); + +describe('find smallest number', () => { + it('should get the min number of an array', () => { + expect(getMin([3, 10, 2])).toEqual(2); + }); + + it('should get the min number of an array with negatives', () => { + expect(getMin([3, 10, -2])).toEqual(-2); + }); + + it('should work with 0', () => { + expect(getMin([3, 0, 2])).toEqual(0); + }); + + it('should work with empty', () => { + expect(getMin([])).toEqual(undefined); + }); +}); \ No newline at end of file diff --git a/src/runtimes/02-binary-search.js b/src/runtimes/02-binary-search.js index 48783459..4e241b85 100644 --- a/src/runtimes/02-binary-search.js +++ b/src/runtimes/02-binary-search.js @@ -18,7 +18,7 @@ function binarySearchRecursive(array, search, offset = 0) { if (current === search) { return offset + half; - } if (array.length < 2) { + } if (array.length === 1) { return -1; } if (search > current) { const right = array.slice(half); diff --git a/src/runtimes/02-binary-search.spec.js b/src/runtimes/02-binary-search.spec.js new file mode 100644 index 00000000..6d1282b7 --- /dev/null +++ b/src/runtimes/02-binary-search.spec.js @@ -0,0 +1,29 @@ +const binarySearch = require('./02-binary-search').binarySearchRecursive; + +describe('Binary Search', () => { + let array; + + beforeEach(() => { + array = [7, 9, 13, 23]; + }); + + it('should find a middle element', () => { + expect(binarySearch(array, 9)).toEqual(1); + }); + + it('should find an first element', () => { + expect(binarySearch(array, 7)).toEqual(0); + }); + + it('should find the last element', () => { + expect(binarySearch(array, 23)).toEqual(3); + }); + + it('should not find an bigger element', () => { + expect(binarySearch(array, 9000)).toEqual(-1); + }); + + it('should find a smaller element', () => { + expect(binarySearch(array, -9)).toEqual(-1); + }); +}); \ No newline at end of file From 49d083bc83bca04b1b5d2f6116e8c8ca25ea2f6d Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 25 Nov 2019 19:51:30 -0500 Subject: [PATCH 032/200] fix lint errors --- src/algorithms/get-min.js | 6 +++--- src/algorithms/get-min.spec.js | 2 +- src/runtimes/02-binary-search.spec.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/algorithms/get-min.js b/src/algorithms/get-min.js index f798084e..6519ee2f 100644 --- a/src/algorithms/get-min.js +++ b/src/algorithms/get-min.js @@ -5,12 +5,12 @@ function getMin(n = []) { let min = n[0]; - n.forEach(element => { - if(element < min) { + n.forEach((element) => { + if (element < min) { min = element; } }); return min; } -module.exports = getMin; \ No newline at end of file +module.exports = getMin; diff --git a/src/algorithms/get-min.spec.js b/src/algorithms/get-min.spec.js index 517a3673..a536e55d 100644 --- a/src/algorithms/get-min.spec.js +++ b/src/algorithms/get-min.spec.js @@ -16,4 +16,4 @@ describe('find smallest number', () => { it('should work with empty', () => { expect(getMin([])).toEqual(undefined); }); -}); \ No newline at end of file +}); diff --git a/src/runtimes/02-binary-search.spec.js b/src/runtimes/02-binary-search.spec.js index 6d1282b7..4850cd7c 100644 --- a/src/runtimes/02-binary-search.spec.js +++ b/src/runtimes/02-binary-search.spec.js @@ -26,4 +26,4 @@ describe('Binary Search', () => { it('should find a smaller element', () => { expect(binarySearch(array, -9)).toEqual(-1); }); -}); \ No newline at end of file +}); From ad15b5f3049af25d5cf6738bd2bf5b02a7bff566 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 6 Jan 2020 19:49:42 -0500 Subject: [PATCH 033/200] improve merge sort example --- src/runtimes/04-merge-sort.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/runtimes/04-merge-sort.js b/src/runtimes/04-merge-sort.js index 0279161f..efb9c7dc 100644 --- a/src/runtimes/04-merge-sort.js +++ b/src/runtimes/04-merge-sort.js @@ -5,22 +5,20 @@ const assert = require('assert'); * Merge two arrays in asc order * @example * merge([2,5,9], [1,6,7]) => [1, 2, 5, 6, 7, 9] - * @param {array} array1 - * @param {array} array2 + * @param {array} a + * @param {array} b * @returns {array} merged arrays in asc order */ -function merge(array1 = [], array2 = []) { +function merge(a = [], b = []) { const merged = []; - let array1Index = 0; - let array2Index = 0; + let ai = 0; + let bi = 0; // merge elements on a and b in asc order. Run-time O(a + b) - while (array1Index < array1.length || array2Index < array2.length) { - if (array1Index >= array1.length || array1[array1Index] > array2[array2Index]) { - merged.push(array2[array2Index]); - array2Index += 1; + for (let ai = 0, bi = 0; ai < a.length || bi < b.length;) { + if(ai >= a.length || a[ai] > b[bi]) { + merged.push(b[bi++]); } else { - merged.push(array1[array1Index]); - array1Index += 1; + merged.push(a[ai++]); } } return merged; @@ -46,7 +44,7 @@ function sort(array = []) { return array[0] > array[1] ? [array[1], array[0]] : array; } // slit and merge - const mid = size / 2; + const mid = parseInt(size / 2, 10); return merge(sort(array.slice(0, mid)), sort(array.slice(mid))); } // end::sort[] @@ -59,3 +57,4 @@ assert.deepStrictEqual(sort(), []); assert.deepStrictEqual(merge([2, 5, 9], [1, 6, 7]), [1, 2, 5, 6, 7, 9]); assert.deepStrictEqual(merge(), []); +assert.deepStrictEqual(merge([3, 5, 7], [2, 4]), [2, 3, 4, 5, 7]); From ac9858348943f9678d116c8076bfa3a3c5362741 Mon Sep 17 00:00:00 2001 From: Mark Ribera Date: Tue, 11 Feb 2020 13:57:34 -0600 Subject: [PATCH 034/200] fix(book): fix typo, array pop, and BST images Typos in book content: makePizza parameter, array.pop() mutation, and BST node values Fixes: #38 --- book/content/part01/algorithms-analysis.asc | 2 +- book/content/part02/array.asc | 2 +- book/images/image33.png | Bin 55827 -> 56138 bytes book/images/image34.png | Bin 60103 -> 60664 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index 92ca306e..29105859 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -33,7 +33,7 @@ Algorithms (as you might know) are steps of how to do some tasks. When you cook, ---- import { punchDown, rollOut, applyToppings, Oven } from '../pizza-utils'; -function makePizza(dough, toppins = ['cheese']) { +function makePizza(dough, toppings = ['cheese']) { const oven = new Oven(450); const punchedDough = punchDown(dough); const rolledDough = rollOut(punchedDough); diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index b301f7cf..c2ef97aa 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -234,7 +234,7 @@ Removing the last element is very straightforward: ---- const array = [2, 5, 1, 9, 111]; array.pop(); // ↪️111 -// array: [2, 5, 1, 9, 111] +// array: [2, 5, 1, 9] ---- No element other element has been shifted, so it’s an _O(1)_ runtime. diff --git a/book/images/image33.png b/book/images/image33.png index d1d0546a001e2ef274a044639719202860100f12..1dcc2428b1be9840a0b47904258bf64b1bf1cadb 100644 GIT binary patch literal 56138 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

dlSVfBmr?`3ZQ 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�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 diff --git a/book/images/image34.png b/book/images/image34.png index d2ebaf7bcd49a4f0eea2aa6bdb876d6973f98742..e2b1129228b6a54d3d20dbd2fa4671bae99f1539 100644 GIT binary patch literal 60664 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⪼ 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 F{ST4Uf9e1L literal 60103 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 Date: Wed, 12 Feb 2020 10:22:31 -0500 Subject: [PATCH 035/200] bump to 1.3.8 --- CHANGELOG.md | 12 +++++++++++- package.json | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23e12bd5..f9a385cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.8] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- fix(book): fix typo, array pop, and BST images [commit](https://github.com/amejiarosario/dsa.js/commit/ac9858348943f9678d116c8076bfa3a3c5362741) + ## [1.3.7] ### Breaking Changes (major) @@ -125,7 +134,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.7...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.8...HEAD +[1.3.7]: https://github.com/amejiarosario/dsa.js/compare/1.3.7...1.3.8 [1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.6...1.3.7 [1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...1.3.6 [1.3.5]: https://github.com/amejiarosario/dsa.js/compare/1.3.4...1.3.5 diff --git a/package.json b/package.json index ad911a4c..f812f907 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.7", + "version": "1.3.8", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From a53915fbbcfe4d2ae32eb204b44b173d3a472456 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 12 Feb 2020 10:50:29 -0500 Subject: [PATCH 036/200] fix(docs): fix typo for heaps --- book/content/part03/tree-intro.asc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/content/part03/tree-intro.asc b/book/content/part03/tree-intro.asc index 4778e014..f95fb889 100644 --- a/book/content/part03/tree-intro.asc +++ b/book/content/part03/tree-intro.asc @@ -90,7 +90,7 @@ image::image33.png[image,width=348,height=189] (((Max-Heap))) (((Min-Heap))) (((Data Structures, Non-Linear, Binary Heap))) -The heap (max-heap) is a type of binary tree where the children's values are higher than the parent. Opposed to the BST, the left child doesn’t have to be smaller than the right child. +The heap (max-heap) is a type of binary tree where the parent's value is higher than the value of both children. Opposed to the BST, the left child doesn’t have to be smaller than the right child. .Heap vs BST image::image34.png[image,width=325,height=176] From c7cb9fdc43df926cd1c00ebf53f7ab49b98cc205 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 12 Feb 2020 11:14:39 -0500 Subject: [PATCH 037/200] update twitter handler --- README.md | 2 +- book/content/part04/dynamic-programming.asc | 2 +- book/content/preface.asc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 301c85fc..3acbc60d 100644 --- a/README.md +++ b/README.md @@ -507,7 +507,7 @@ This project is also available in a [book](https://books.adrianmejia.com/dsajs-d Reach out to me at one of the following places! -- Twitter at `@amejiarosario` +- Twitter at `@iAmAdrianMejia` - Chat on `dsajs.slack.com` ## License diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc index 25bf3ce0..7773f000 100644 --- a/book/content/part04/dynamic-programming.asc +++ b/book/content/part04/dynamic-programming.asc @@ -9,7 +9,7 @@ endif::[] (((Algorithmic Techniques, Dynamic Programming))) Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. -// https://twitter.com/amejiarosario/status/1103050924933726208 +// https://twitter.com/iAmAdrianMejia/status/1103050924933726208 // https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson // https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 // https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem diff --git a/book/content/preface.asc b/book/content/preface.asc index 7f983404..7e03dcd6 100644 --- a/book/content/preface.asc +++ b/book/content/preface.asc @@ -82,4 +82,4 @@ Measurement is the first step that leads to control and eventually to improvemen Your feedback is very welcome and valuable. Let us know what your thoughts about this book — what you like or ideas to make it better. -To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/amejiarosario[@amejiarosario], or using the hash tags `#dsaJS`, `#javascript` and `#algorithms`. +To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/iAmAdrianMejia[@iAmAdrianMejia], or using the hash tags `#dsaJS`, `#javascript` and `#algorithms`. From 6fbd551878c1ecccccb3643e55295383a9102f96 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 12 Feb 2020 11:14:39 -0500 Subject: [PATCH 038/200] docs: update twitter handler --- README.md | 2 +- book/content/part04/dynamic-programming.asc | 2 +- book/content/preface.asc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 301c85fc..3acbc60d 100644 --- a/README.md +++ b/README.md @@ -507,7 +507,7 @@ This project is also available in a [book](https://books.adrianmejia.com/dsajs-d Reach out to me at one of the following places! -- Twitter at `@amejiarosario` +- Twitter at `@iAmAdrianMejia` - Chat on `dsajs.slack.com` ## License diff --git a/book/content/part04/dynamic-programming.asc b/book/content/part04/dynamic-programming.asc index 25bf3ce0..7773f000 100644 --- a/book/content/part04/dynamic-programming.asc +++ b/book/content/part04/dynamic-programming.asc @@ -9,7 +9,7 @@ endif::[] (((Algorithmic Techniques, Dynamic Programming))) Dynamic programming (dp) is a way to solve algorithmic problems with *overlapping subproblems*. Algorithms using dp find the base case and building a solution from the ground-up. Dp _keep track_ of previous results to avoid re-computing the same operations. -// https://twitter.com/amejiarosario/status/1103050924933726208 +// https://twitter.com/iAmAdrianMejia/status/1103050924933726208 // https://www.quora.com/How-should-I-explain-dynamic-programming-to-a-4-year-old/answer/Jonathan-Paulson // https://medium.com/@codingfreak/top-50-dynamic-programming-practice-problems-4208fed71aa3 // https://www.slideshare.net/balamoorthy39/greedy-algorithm-knapsack-problem diff --git a/book/content/preface.asc b/book/content/preface.asc index 7f983404..7e03dcd6 100644 --- a/book/content/preface.asc +++ b/book/content/preface.asc @@ -82,4 +82,4 @@ Measurement is the first step that leads to control and eventually to improvemen Your feedback is very welcome and valuable. Let us know what your thoughts about this book — what you like or ideas to make it better. -To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/amejiarosario[@amejiarosario], or using the hash tags `#dsaJS`, `#javascript` and `#algorithms`. +To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/iAmAdrianMejia[@iAmAdrianMejia], or using the hash tags `#dsaJS`, `#javascript` and `#algorithms`. From 535afe614f827bce3ba87477c00bc2c33f6be9ea Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 17 Mar 2020 21:34:04 -0400 Subject: [PATCH 039/200] subset/powerset problem --- .../01-arrays/powerset/powerset-backtrack.js | 18 ++++++++ .../powerset/powerset-binaryNumbers.js | 27 +++++++++++ .../01-arrays/powerset/powerset-concat.js | 16 +++++++ .../01-arrays/powerset/powerset.spec.js | 46 +++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 lab/exercises/01-arrays/powerset/powerset-backtrack.js create mode 100644 lab/exercises/01-arrays/powerset/powerset-binaryNumbers.js create mode 100644 lab/exercises/01-arrays/powerset/powerset-concat.js create mode 100644 lab/exercises/01-arrays/powerset/powerset.spec.js diff --git a/lab/exercises/01-arrays/powerset/powerset-backtrack.js b/lab/exercises/01-arrays/powerset/powerset-backtrack.js new file mode 100644 index 00000000..b76994ca --- /dev/null +++ b/lab/exercises/01-arrays/powerset/powerset-backtrack.js @@ -0,0 +1,18 @@ +/** + * + * @param {*} nums + */ +function subsetBacktrack(nums, start = 0, current = [], result = []) { + // console.log({ nums, start, current, result }); + result.push([...current]); + + for (let i = start; i < nums.length; i++) { + current.push(nums[i]); + subsetBacktrack(nums, i + 1, current, result); + current.pop(); + // console.log(current.pop()); + } + return result; +} + +module.exports = subsetBacktrack; diff --git a/lab/exercises/01-arrays/powerset/powerset-binaryNumbers.js b/lab/exercises/01-arrays/powerset/powerset-binaryNumbers.js new file mode 100644 index 00000000..c5ec6197 --- /dev/null +++ b/lab/exercises/01-arrays/powerset/powerset-binaryNumbers.js @@ -0,0 +1,27 @@ +/** + * Bitmask approach + * @param {number[]} nums + * @return {number[][]} + */ +function subsetsBinary(nums) { + const len = nums.length; + const max = 2 ** len; + const result = []; + + for (let bin = 0; bin < max; bin++) { + const bitmask = bin.toString(2).padStart(len, '0'); + + const el = Array.from(bitmask).reduce((a, bit, i) => { + if (bit === '1') { + return a.concat(nums[i]); + } + return a; + }, []); + + result.push(el); + } + + return result; +} + +module.exports = subsetsBinary; diff --git a/lab/exercises/01-arrays/powerset/powerset-concat.js b/lab/exercises/01-arrays/powerset/powerset-concat.js new file mode 100644 index 00000000..17f1e782 --- /dev/null +++ b/lab/exercises/01-arrays/powerset/powerset-concat.js @@ -0,0 +1,16 @@ +/** + * + * https://leetcode.com/problems/subsets + * @param {number[]} nums + * @return {number[][]} + */ +function subsetsConcat(nums) { + return nums.reduce((result, n) => { + const newSet = result.map(r => r.concat(n)); + return result.concat(newSet); // O(n * n^2) bcuz copy + }, [ + [], + ]); +} + +module.exports = subsetsConcat; diff --git a/lab/exercises/01-arrays/powerset/powerset.spec.js b/lab/exercises/01-arrays/powerset/powerset.spec.js new file mode 100644 index 00000000..b308d9c2 --- /dev/null +++ b/lab/exercises/01-arrays/powerset/powerset.spec.js @@ -0,0 +1,46 @@ +// npx jest lab/exercises/01-arrays/powerset/powerset.spec.js --watch + +const backtrack = require('./powerset-backtrack'); +const subsetsBinary = require('./powerset-binaryNumbers'); +const subsetsConcat = require('./powerset-concat'); + +const approaches = [backtrack, subsetsBinary, subsetsConcat]; + +approaches.forEach((approach) => { + describe(`Powerset ${approach.name}`, () => { + it('should work with 0 elements', () => { + expect(approach([])).toEqual([ + [], + ]); + }); + + it('should work with 1 element', () => { + expect(approach([1])).toEqual([ + [], + [1], + ]); + }); + + it('should work with 2 elements', () => { + expect(approach([1, 2])).toEqual(expect.arrayContaining([ + [], + [1], + [2], + [1, 2], + ])); + }); + + it('should work with 3 elements', () => { + expect(approach([1, 2, 3])).toEqual(expect.arrayContaining([ + [], + [1], + [2], + [1, 2], + [3], + [2, 3], + [1, 3], + [1, 2, 3], + ])); + }); + }); +}); From bc51a7a0c97aea9dea1afa5f8af22c0bed1382d3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 19 Mar 2020 14:33:48 -0400 Subject: [PATCH 040/200] fix(book): fix table typos --- book/content/part02/array-vs-list-vs-queue-vs-stack.asc | 8 ++++---- book/content/part04/backtracking.asc | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc index cbf95e7a..6d7439e7 100644 --- a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -32,10 +32,10 @@ In this part of the book, we explored the most used linear data structures such .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ | <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) -| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|*O(n)* ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) +| <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|*O(1)* ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) | <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) -| Queue (w/array) ^|- ^|- ^|- ^|- ^|*O(n)* ^|- ^|- ^|O(1) ^|O(n) -| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) +| Queue (w/array) ^|- ^|- ^|- ^|- ^|O(1) ^|*O(n)* ^|- ^|- ^|O(n) +| <> (w/list) ^|- ^|- ^|- ^|- ^|O(1) ^|*O(1)* ^|- ^|- ^|O(n) |=== // end::table[] diff --git a/book/content/part04/backtracking.asc b/book/content/part04/backtracking.asc index f92819dc..aedc6a91 100644 --- a/book/content/part04/backtracking.asc +++ b/book/content/part04/backtracking.asc @@ -20,7 +20,7 @@ endif::backend-pdf[] Listing all possible solutions might sound like a brute force. However, it is not the same. -Backtracking algorithms are faster than brute force one. +Backtracking algorithms are faster because it test if a path will lead to a solution or not. .Brute Force vs. Backtracking Algorithms **** diff --git a/package.json b/package.json index f812f907..c1fc41e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.8", + "version": "1.3.9", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 2521d1efb544ae35f1345066ba5155002693796f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 19 Mar 2020 15:28:14 -0400 Subject: [PATCH 041/200] docs: add new changelog and exercises --- CHANGELOG.md | 12 +++++++- .../09-backtracking/generate-parentheses.js | 28 +++++++++++++++++++ .../generate-parentheses.spec.js | 27 ++++++++++++++++++ .../09-backtracking/powerset-backtrack.js | 1 + notes.md | 7 ++--- 5 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 lab/exercises/09-backtracking/generate-parentheses.js create mode 100644 lab/exercises/09-backtracking/generate-parentheses.spec.js create mode 120000 lab/exercises/09-backtracking/powerset-backtrack.js diff --git a/CHANGELOG.md b/CHANGELOG.md index f9a385cf..c6967729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes (patch) +## [1.3.9] + +### Breaking Changes (major) + +### New Features (minor) + +### Bug Fixes (patch) +- fix(book): fix table typos [commit](https://github.com/amejiarosario/dsa.js/commit/bc51a7a0c97aea9dea1afa5f8af22c0bed1382d3) + ## [1.3.8] ### Breaking Changes (major) @@ -134,7 +143,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - -[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.8...HEAD +[Unreleased]: https://github.com/amejiarosario/dsa.js/compare/1.3.9...HEAD +[1.3.9]: https://github.com/amejiarosario/dsa.js/compare/1.3.8...1.3.9 [1.3.7]: https://github.com/amejiarosario/dsa.js/compare/1.3.7...1.3.8 [1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.6...1.3.7 [1.3.6]: https://github.com/amejiarosario/dsa.js/compare/1.3.5...1.3.6 diff --git a/lab/exercises/09-backtracking/generate-parentheses.js b/lab/exercises/09-backtracking/generate-parentheses.js new file mode 100644 index 00000000..7fee361b --- /dev/null +++ b/lab/exercises/09-backtracking/generate-parentheses.js @@ -0,0 +1,28 @@ +/** + * https://leetcode.com/submissions/detail/313704254/ + * @param {number} n + * @return {string[]} + */ +function generateParenthesis(n, result = [], open = 0, close = 0, curr = '') { + if (curr.length === n * 2) { + result.push(curr); + } else { + if (open < n) { + generateParenthesis(n, result, open + 1, close, `${curr}(`); + } + if (close < n) { + generateParenthesis(n, result, open, close + 1, `${curr})`); + } + } + + return result; +} + +module.exports = generateParenthesis; + +/* +0: [""] +1: ["()"] +2: ["(())", "()()"] +3: ["((()))", "()()()", "(())()", "()(())"] +*/ diff --git a/lab/exercises/09-backtracking/generate-parentheses.spec.js b/lab/exercises/09-backtracking/generate-parentheses.spec.js new file mode 100644 index 00000000..22285d55 --- /dev/null +++ b/lab/exercises/09-backtracking/generate-parentheses.spec.js @@ -0,0 +1,27 @@ +const generateParenthesis = require('./generate-parentheses'); + +describe('Generate Parenthesis', () => { + it('should work with 0', () => { + expect(generateParenthesis(1)).toEqual(expect.arrayContaining([ + ])); + }); + + it('should work with 1', () => { + expect(generateParenthesis(1)).toEqual(expect.arrayContaining([ + '()', + ])); + }); + + it('should work with 2', () => { + expect(generateParenthesis(2)).toEqual(expect.arrayContaining([ + '(())', + '()()', + ])); + }); + + it('should work with 3', () => { + expect(generateParenthesis(3)).toEqual(expect.arrayContaining( + ['((()))', '(()())', '(())()', '()(())', '()()()'], + )); + }); +}); diff --git a/lab/exercises/09-backtracking/powerset-backtrack.js b/lab/exercises/09-backtracking/powerset-backtrack.js new file mode 120000 index 00000000..7cce8c0f --- /dev/null +++ b/lab/exercises/09-backtracking/powerset-backtrack.js @@ -0,0 +1 @@ +../01-arrays/powerset/powerset-backtrack.js \ No newline at end of file diff --git a/notes.md b/notes.md index 2f927d2b..21f8845e 100644 --- a/notes.md +++ b/notes.md @@ -22,9 +22,9 @@ git log HEAD --pretty=format:%s # example git log 1.1.0..HEAD --pretty=format:%s -git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" -git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" -git log 1.3.6..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" +git log 1.3.8..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" +git log 1.3.8..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat.*:" +git log 1.3.8..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix.*:" ``` New features in this release @@ -117,4 +117,3 @@ alert('foo'); console.log('bar'); /* eslint-enable no-alert */ ``` - From a0e0fd8dec28ccdf99765c98dd1a07dec7b3ff6c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 22 Mar 2020 12:04:11 -0400 Subject: [PATCH 042/200] feat(trie): implement trie data structure --- src/data-structures/trees/trie-1.js | 75 ++++++++++++++ src/data-structures/trees/trie.js | 98 ++++++++++++++++++ src/data-structures/trees/trie.spec.js | 133 +++++++++++++++++++++++++ 3 files changed, 306 insertions(+) create mode 100644 src/data-structures/trees/trie-1.js create mode 100644 src/data-structures/trees/trie.js create mode 100644 src/data-structures/trees/trie.spec.js diff --git a/src/data-structures/trees/trie-1.js b/src/data-structures/trees/trie-1.js new file mode 100644 index 00000000..80ede3b0 --- /dev/null +++ b/src/data-structures/trees/trie-1.js @@ -0,0 +1,75 @@ +class Trie { + constructor(val) { + this.val = val; + this.children = {}; + this.isWord = false; + } + + /** + * Insert word into trie and mark last element as such. + * @param {string} word + * @return {undefined} + */ + insert(word) { + let curr = this; + + for (const char of word) { + curr.children[char] = curr.children[char] || new Trie(char); + curr = curr.children[char]; + } + + curr.isWord = true; + } + + /** + * Search for complete word (by default) or partial if flag is set. + * @param {string} word - Word to search. + * @param {boolean} options.partial - Whether or not match partial matches. + * @return {boolean} + */ + search(word, { partial } = {}) { + let curr = this; + + for (const char of word) { + if (!curr.children[char]) { return false; } + curr = curr.children[char]; + } + + return partial ? true : curr.isWord; + } + + /** + * Return true if any word on the trie starts with the given prefix + * @param {string} prefix - Partial word to search. + * @return {boolean} + */ + startsWith(prefix) { + return this.search(prefix, { partial: true }); + } + + /** + * Returns all the words from the current `node`. + * Uses backtracking. + * + * @param {string} prefix - The prefix to append to each word. + * @param {string} node - Current node to start backtracking. + * @param {string[]} words - Accumulated words. + * @param {string} string - Current string. + */ + getAllWords(prefix = '', node = this, words = [], string = '') { + if (node.isWord) { + words.push(`${prefix}${string}`); + } + + for (const char of Object.keys(node.children)) { + this.getAllWords(prefix, node.children[char], words, `${string}${char}`); + } + + return words; + } +} + +// Aliases +Trie.prototype.add = Trie.prototype.insert; + +module.exports = Trie; diff --git a/src/data-structures/trees/trie.js b/src/data-structures/trees/trie.js new file mode 100644 index 00000000..4a7a7f41 --- /dev/null +++ b/src/data-structures/trees/trie.js @@ -0,0 +1,98 @@ +class Trie { + constructor(val) { + this.val = val; + this.children = {}; + this.isWord = false; + } + + /** + * Insert word into trie and mark last element as such. + * @param {string} word + * @return {undefined} + */ + insert(word) { + let curr = this; + + for (const char of word) { + curr.children[char] = curr.children[char] || new Trie(char); + curr = curr.children[char]; + } + + curr.isWord = true; + } + + /** + * Retun last node that matches word or prefix or false if not found. + * @param {string} word - Word to search. + * @param {boolean} options.partial - Whether or not match partial matches. + * @return {Trie|false} + */ + searchNode(word) { + let curr = this; + + for (const char of word) { + if (!curr.children[char]) { return false; } + curr = curr.children[char]; + } + + return curr; + } + + /** + * Search for complete word (by default) or partial if flag is set. + * @param {string} word - Word to search. + * @param {boolean} options.partial - Whether or not match partial matches. + * @return {boolean} + */ + search(word, { partial } = {}) { + const curr = this.searchNode(word); + if (!curr) { return false; } + return partial ? true : curr.isWord; + } + + /** + * Return true if any word on the trie starts with the given prefix + * @param {string} prefix - Partial word to search. + * @return {boolean} + */ + startsWith(prefix) { + return this.search(prefix, { partial: true }); + } + + /** + * Returns all the words from the current `node`. + * Uses backtracking. + * + * @param {string} prefix - The prefix to append to each word. + * @param {string} node - Current node to start backtracking. + * @param {string[]} words - Accumulated words. + * @param {string} string - Current string. + */ + getAllWords(prefix = '', node = this, words = [], string = '') { + if (!node) { return words; } + if (node.isWord) { + words.push(`${prefix}${string}`); + } + + for (const char of Object.keys(node.children)) { + this.getAllWords(prefix, node.children[char], words, `${string}${char}`); + } + + return words; + } + + /** + * Return a list of words matching the prefix + * @param {*} prefix - The prefix to match. + * @returns {string[]} + */ + autocomplete(prefix = '') { + const curr = this.searchNode(prefix); + return this.getAllWords(prefix, curr); + } +} + +// Aliases +Trie.prototype.add = Trie.prototype.insert; + +module.exports = Trie; diff --git a/src/data-structures/trees/trie.spec.js b/src/data-structures/trees/trie.spec.js new file mode 100644 index 00000000..f72f7adf --- /dev/null +++ b/src/data-structures/trees/trie.spec.js @@ -0,0 +1,133 @@ +const Trie = require('./trie'); + +describe('Trie', () => { + let trie; + + beforeEach(() => { + trie = new Trie(); + }); + + describe('construtor', () => { + it('should initialize trie', () => { + expect(trie).toBeDefined(); + }); + + it('should set default value to undefined', () => { + expect(trie.val).toEqual(undefined); + }); + + it('should initialization value', () => { + trie = new Trie(1); + expect(trie.val).toEqual(1); + }); + + it('should initialize children as empty map', () => { + expect(trie.children).toEqual({}); + }); + + it('should not be a word by default', () => { + expect(trie.isWord).toEqual(false); + }); + }); + + describe('insert', () => { + it('should insert a word', () => { + trie.insert('ab'); + expect(trie.children.a).toBeDefined(); + expect(trie.children.a.children.b).toBeDefined(); + expect(trie.children.a.isWord).toEqual(false); + expect(trie.children.a.children.b.isWord).toEqual(true); + }); + + it('should insert multiple words with the same root', () => { + trie.insert('a'); + trie.insert('ab'); + expect(trie.children.a.isWord).toEqual(true); + expect(trie.children.a.children.b.isWord).toEqual(true); + }); + }); + + describe('search & startsWith', () => { + beforeEach(() => { + trie.insert('dog'); + trie.insert('dogs'); + trie.insert('door'); + }); + + it('should search for words', () => { + expect(trie.search('dog')).toEqual(true); + }); + + it('should not match incomplete words by default', () => { + expect(trie.search('do')).toEqual(false); + }); + + it('should match partial words if partial is set', () => { + expect(trie.search('do', { + partial: true, + })).toEqual(true); + expect(trie.startsWith('do')).toEqual(true); + }); + + it('should not match non existing words', () => { + expect(trie.search('doors')).toEqual(false); + }); + + it('should not match non existing words with partials', () => { + expect(trie.search('doors', { + partial: true, + })).toEqual(false); + expect(trie.startsWith('doors')).toEqual(false); + }); + }); + + describe('when multiple words are inserted', () => { + beforeEach(() => { + trie.insert('dog'); + trie.insert('dogs'); + trie.insert('door'); + trie.insert('day'); + trie.insert('cat'); + }); + + describe('getAllWords', () => { + it('should get all words', () => { + const words = trie.getAllWords(); + expect(words.length).toEqual(5); + expect(words).toEqual(['dog', 'dogs', 'door', 'day', 'cat']); + }); + + it('should use prefix', () => { + const words = trie.getAllWords("Adrian's "); + expect(words.length).toEqual(5); + expect(words).toEqual([ + "Adrian's dog", + "Adrian's dogs", + "Adrian's door", + "Adrian's day", + "Adrian's cat", + ]); + }); + }); + + describe('autocomplete', () => { + it('should return all words if not prefix is given', () => { + const words = trie.autocomplete(); + expect(words.length).toBe(5); + expect(words).toEqual(['dog', 'dogs', 'door', 'day', 'cat']); + }); + + it('should auto complete words given a prefix', () => { + const words = trie.autocomplete('do'); + expect(words.length).toBe(3); + expect(words).toEqual(['dog', 'dogs', 'door']); + }); + + it('should handle non-existing words prefixes', () => { + const words = trie.autocomplete('co'); + expect(words.length).toBe(0); + expect(words).toEqual([]); + }); + }); + }); +}); From 524670ebfb5b02ce68a5e27201c826e473aa5454 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 22 Mar 2020 12:20:57 -0400 Subject: [PATCH 043/200] simplify backtracking algorithm --- src/data-structures/trees/trie.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/data-structures/trees/trie.js b/src/data-structures/trees/trie.js index 4a7a7f41..b634443b 100644 --- a/src/data-structures/trees/trie.js +++ b/src/data-structures/trees/trie.js @@ -65,17 +65,18 @@ class Trie { * * @param {string} prefix - The prefix to append to each word. * @param {string} node - Current node to start backtracking. - * @param {string[]} words - Accumulated words. - * @param {string} string - Current string. */ - getAllWords(prefix = '', node = this, words = [], string = '') { + getAllWords(prefix = '', node = this) { + let words = []; + if (!node) { return words; } if (node.isWord) { - words.push(`${prefix}${string}`); + words.push(prefix); } for (const char of Object.keys(node.children)) { - this.getAllWords(prefix, node.children[char], words, `${string}${char}`); + const newWords = this.getAllWords(`${prefix}${char}`, node.children[char]); + words = words.concat(newWords); } return words; From 19ff1f0c3c660d816558e8e9e763db8fa6cc146a Mon Sep 17 00:00:00 2001 From: Vaibhav Tank Date: Sun, 22 Mar 2020 22:57:09 -0700 Subject: [PATCH 044/200] initial updates --- book/content/dedication.asc | 2 +- book/content/part01/algorithms-analysis.asc | 12 +++--- book/content/part01/big-o-examples.asc | 22 +++++----- .../array-vs-list-vs-queue-vs-stack.asc | 2 +- book/content/part02/array.asc | 18 ++++----- book/content/part02/linked-list.asc | 40 +++++++++---------- book/content/part02/queue.asc | 8 ++-- book/content/part02/stack.asc | 8 ++-- book/content/preface.asc | 6 +-- book/part02-linear-data-structures.asc | 2 +- src/data-structures/queues/queue.js | 2 +- 11 files changed, 61 insertions(+), 61 deletions(-) diff --git a/book/content/dedication.asc b/book/content/dedication.asc index 2d833fbf..069d116c 100644 --- a/book/content/dedication.asc +++ b/book/content/dedication.asc @@ -1,4 +1,4 @@ [dedication] == Dedication -_To my wife Nathalie that supported me in my long hours of writing and my baby girl Abigail._ +_To my wife Nathalie who supported me in my long hours of writing and my baby girl Abigail._ diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index 29105859..0309e69c 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -5,7 +5,7 @@ endif::[] === Fundamentals of Algorithms Analysis -Probably you are reading this book because you want to write better and faster code. +You are probably reading this book because you want to write better and faster code. How can you do that? Can you time how long it takes to run a program? Of course, you can! [big]#⏱# However, if you run the same program on a smartwatch, cellphone or desktop computer, it will take different times. @@ -15,7 +15,7 @@ image::image3.png[image,width=528,height=137] Wouldn't it be great if we can compare algorithms regardless of the hardware where we run them? That's what *time complexity* is for! But, why stop with the running time? -We could also compare the memory "used" by different algorithms, and we called that *space complexity*. +We could also compare the memory "used" by different algorithms, and we call that *space complexity*. .In this chapter you will learn: - What’s the best way to measure the performance of your code regardless of what hardware you use. @@ -68,7 +68,7 @@ To give you a clearer picture of how different algorithms perform as the input s Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. -Organizing 1 million elements with merge sort takes 20 seconds while bubble sort takes 12 days, ouch! +Organizing 1 million elements with merge sort takes 20 seconds while selection sort takes 12 days, ouch! The amazing thing is that both programs are solving the same problem with equal data and hardware; and yet, there's a big difference in time! After completing this book, you are going to _think algorithmically_. @@ -135,7 +135,7 @@ There’s a notation called *Big O*, where `O` refers to the *order of the funct TIP: Big O = Big Order of a function. -If you have a program which runtime is: +If you have a program that has a runtime of: _7n^3^ + 3n^2^ + 5_ @@ -144,7 +144,7 @@ You can express it in Big O notation as _O(n^3^)_. The other terms (_3n^2^ + 5_) Big O notation, only cares about the “biggest” terms in the time/space complexity. So, it combines what we learn about time and space complexity, asymptotic analysis and adds a worst-case scenario. .All algorithms have three scenarios: -* Best-case scenario: the most favorable input arrange where the program will take the least amount of operations to complete. E.g., array already sorted is beneficial for some sorting algorithms. +* Best-case scenario: the most favorable input arrangement where the program will take the least amount of operations to complete. E.g., an array that's already sorted is beneficial for some sorting algorithms. * Average-case scenario: this is the most common case. E.g., array items in random order for a sorting algorithm. * Worst-case scenario: the inputs are arranged in such a way that causes the program to take the longest to complete. E.g., array items in reversed order for some sorting algorithm will take the longest to run. @@ -154,7 +154,7 @@ TIP: Big O only cares about the highest order of the run time function and the w WARNING: Don't drop terms that are multiplying other terms. _O(n log n)_ is not equivalent to _O(n)_. However, _O(n + log n)_ is. -There are many common notations like polynomial, _O(n^2^)_ like we saw in the `getMin` example; constant _O(1)_ and many more that we are going to explore in the next chapter. +There are many common notations like polynomial, _O(n^2^)_ as we saw in the `getMin` example; constant _O(1)_ and many more that we are going to explore in the next chapter. Again, time complexity is not a direct measure of how long a program takes to execute, but rather how many operations it performs given the input size. Nevertheless, there’s a relationship between time complexity and clock time as we can see in the following table. (((Tables, Intro, Input size vs clock time by Big O))) diff --git a/book/content/part01/big-o-examples.asc b/book/content/part01/big-o-examples.asc index 55042627..3b56e1a0 100644 --- a/book/content/part01/big-o-examples.asc +++ b/book/content/part01/big-o-examples.asc @@ -7,7 +7,7 @@ endif::[] There are many kinds of algorithms. Most of them fall into one of the eight time complexities that we are going to explore in this chapter. -.Eight Running Time complexity You Should Know +.Eight Running Time Complexities You Should Know - Constant time: _O(1)_ - Logarithmic time: _O(log n)_ - Linear time: _O(n)_ @@ -17,7 +17,7 @@ There are many kinds of algorithms. Most of them fall into one of the eight time - Exponential time: _O(2^n^)_ - Factorial time: _O(n!)_ -We a going to provide examples for each one of them. +We are going to provide examples for each one of them. Before we dive in, here’s a plot with all of them. @@ -30,7 +30,7 @@ The above chart shows how the running time of an algorithm is related to the amo ==== Constant (((Constant))) (((Runtime, Constant))) -Represented as *O(1)*, it means that regardless of the input size the number of operations executed is always the same. Let’s see an example. +Represented as *O(1)*, it means that regardless of the input size, the number of operations executed is always the same. Let’s see an example: [#constant-example] ===== Finding if an array is empty @@ -47,7 +47,7 @@ include::{codedir}/runtimes/01-is-empty.js[tag=isEmpty] Another more real life example is adding an element to the begining of a <>. You can check out the implementation <>. -As you can see, in both examples (array and linked list) if the input is a collection of 10 elements or 10M it would take the same amount of time to execute. You can't get any more performant than this! +As you can see in both examples (array and linked list), if the input is a collection of 10 elements or 10M, it would take the same amount of time to execute. You can't get any more performant than this! [[logarithmic]] ==== Logarithmic @@ -68,7 +68,7 @@ The binary search only works for sorted lists. It starts searching for an elemen include::{codedir}/runtimes/02-binary-search.js[tag=binarySearchRecursive] ---- -This binary search implementation is a recursive algorithm, which means that the function `binarySearch` calls itself multiple times until the solution is found. The binary search splits the array in half every time. +This binary search implementation is a recursive algorithm, which means that the function `binarySearchRecursive` calls itself multiple times until the solution is found. The binary search splits the array in half every time. Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. @@ -92,8 +92,8 @@ include::{codedir}/runtimes/03-has-duplicates.js[tag=hasDuplicates] .`hasDuplicates` has multiple scenarios: * *Best-case scenario*: first two elements are duplicates. It only has to visit two elements. -* *Worst-case scenario*: no duplicated or duplicated are the last two. In either case, it has to visit every item on the array. -* *Average-case scenario*: duplicates are somewhere in the middle of the collection. Only, half of the array will be visited. +* *Worst-case scenario*: no duplicates or duplicates are the last two. In either case, it has to visit every item in the array. +* *Average-case scenario*: duplicates are somewhere in the middle of the collection. Only half of the array will be visited. As we learned before, the big O cares about the worst-case scenario, where we would have to visit every element on the array. So, we have an *O(n)* runtime. @@ -147,11 +147,11 @@ Usually they have double-nested loops, where each one visits all or most element [[quadratic-example]] ===== Finding duplicates in an array (naïve approach) -If you remember we have solved this problem more efficiently on the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: +If you remember, we have solved this problem more efficiently in the <> section. We solved this problem before using an _O(n)_, let’s solve it this time with an _O(n^2^)_: // image:image12.png[image,width=527,height=389] -.Naïve implementation of has duplicates function +.Naïve implementation of hasDuplicates function [source, javascript] ---- include::{codedir}/runtimes/05-has-duplicates-naive.js[tag=hasDuplicates] @@ -159,7 +159,7 @@ include::{codedir}/runtimes/05-has-duplicates-naive.js[tag=hasDuplicates] As you can see, we have two nested loops causing the running time to be quadratic. How much difference is there between a linear vs. quadratic algorithm? -Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <> you will get the answer in seconds! [big]#🚀# +Let’s say you want to find a duplicated middle name in a phone directory book of a city of ~1 million people. If you use this quadratic solution, you would have to wait for ~12 days to get an answer [big]#🐢#; while if you use the <>, you will get the answer in seconds! [big]#🚀# [[cubic]] ==== Cubic @@ -186,7 +186,7 @@ include::{codedir}/runtimes/06-multi-variable-equation-solver.js[tag=findXYZ] WARNING: This is just an example, there are better ways to solve multi-variable equations. -As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on when we have a runtime in the form of _O(n^c^)_, where _c > 1_, we refer to this as a *polynomial runtime*. +As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on. When we have a runtime in the form of _O(n^c^)_, where _c > 1_, we refer to this as a *polynomial runtime*. [[exponential]] ==== Exponential diff --git a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc index 6d7439e7..bc289ed8 100644 --- a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -17,7 +17,7 @@ In this part of the book, we explored the most used linear data structures such * You want constant time to remove/add from extremes of the list. .Use a Queue when: -* You need to access your data in a first-come, first served basis (FIFO). +* You need to access your data on a first-come, first served basis (FIFO). * You need to implement a <> .Use a Stack when: diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index c2ef97aa..6c95d376 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -17,7 +17,7 @@ TIP: Strings are a collection of Unicode characters and most of the array concep .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed size arrays like Java and C++. Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in C++ and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, Python use dynamic arrays by default. +Some programming languages have fixed size arrays like Java and C++. Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in C++ and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: @@ -29,7 +29,7 @@ Arrays are a sequential collection of elements that can be accessed randomly usi ==== Insertion -Arrays are built-in into most languages. Inserting an element is simple; you can either add them on creation time or after initialization. Below you can find an example for both cases: +Arrays are built-in into most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: .Inserting elements into an array [source, javascript] @@ -44,7 +44,7 @@ array2[100] = 2; array2 // [empty × 3, 1, empty × 96, 2] ---- -Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values in whatever index you like index 3 or even 100! In the `array2` we inserted 2 numbers, but the length is 101, and there are 99 empty spaces. +Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers but the length is 101 and there are 99 empty spaces. [source, javascript] ---- @@ -87,7 +87,7 @@ const array = [2, 5, 1, 9, 6, 7]; array.splice(1, 0, 111); // ↪️ [] <1> // array: [2, 111, 5, 1, 9, 6, 7] ---- -<1> at the position `1`, delete `0` elements and insert `111`. +<1> at position `1`, delete `0` elements and insert `111`. The Big O for this operation would be *O(n)* since in worst case it would move most of the elements to the right. @@ -132,7 +132,7 @@ const array = [2, 5, 1, 9, 6, 7]; array[4]; // ↪️ 6 ---- -Searching by index takes constant time, *O(1)*, to retrieve values out of the array. If we want to get fancier we can create a function: +Searching by index takes constant time - *O(1)* - to retrieve values out of the array. If we want to get fancier, we can create a function: // image:image17.png[image,width=528,height=293] @@ -184,7 +184,7 @@ We would have to loop through the whole array (worst case) or until we find it: ==== Deletion -Deleting (similar to insertion) there are three possible scenarios, removing at the beginning, middle or end. +There are three possible scenarios for deletion (similar to insertion): removing at the beginning, middle or end. ===== Deleting element from the beginning @@ -223,7 +223,7 @@ array.splice(2, 1); // ↪️[2] <1> ---- <1> delete 1 element at position 2 -Deleting from the middle might cause most the elements of the array to move back one position to fill in for the eliminated item. Thus, runtime: O(n). +Deleting from the middle might cause most of the elements of the array to move up one position to fill in for the eliminated item. Thus, runtime: O(n). ===== Deleting element from the end @@ -237,7 +237,7 @@ array.pop(); // ↪️111 // array: [2, 5, 1, 9] ---- -No element other element has been shifted, so it’s an _O(1)_ runtime. +No other element has been shifted, so it’s an _O(1)_ runtime. .JavaScript built-in `array.pop` **** @@ -264,7 +264,7 @@ To sum up, the time complexity of an array is: (((Runtime, Constant))) (((Tables, Linear DS, JavaScript Array buit-in operations Complexities))) -.Array Operations timex complexity +.Array Operations time complexity |=== | Operation | Time Complexity | Usage | push ^| O(1) | Insert element to the right side. diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index d05ed265..263caef3 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -12,18 +12,18 @@ A list (or Linked List) is a linear data structure where each node is "linked" t .Linked Lists can be: - Singly: every item has a pointer to the next node -- Doubly: every node has a reference to the next and previous object +- Doubly: every node has a reference to the next and previous node - Circular: the last element points to the first one. [[singly-linked-list]] ==== Singly Linked List -Each element or node is *connected* to the next one by a reference. When a node only has one connection it's called *singly linked list*: +Each element or node is *connected* to the next one by a reference. When a node only has one connection, it's called a *singly linked list*: .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. image::image19.png[image,width=498,height=97] -Usually, a Linked List is referenced by the first element in called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. +Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. [[doubly-linked-list]] ==== Doubly Linked List @@ -33,7 +33,7 @@ When each node has a connection to the `next` item and also the `previous` one, .Doubly Linked List: each node has a reference to the next and previous element. image::image20.png[image,width=528,height=74] -With a doubly list you can not only move forward but also backward. If you keep the reference to the last element (`cat`) you can step back and reach the middle part. +With a doubly list, you can not only move forward but also backward. If you keep the reference to the last element (`cat`) you can step back and reach the middle part. If we implement the code for the `Node` elements, it would be something like this: @@ -47,13 +47,13 @@ include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ==== Linked List vs. Array -Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t always an array more efficient with _O(1)_ access time? It depends. +Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. -We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. When it is getting full, it has to create a bigger array (usually 2x) and copy all the elements. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory it needs. They don’t have to be next to each other, nor large chunks of memory have to be booked beforehand like arrays. Linked List is more on a "grow as you go" basis. +We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. When it is getting full, it has to create a bigger array (usually 2x) and copy all the elements. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor large chunks of memory have to be booked beforehand like arrays. Linked List is more on a "grow as you go" basis. Another difference is that adding/deleting at the beginning on an array takes O(n); however, the linked list is a constant operation O(1) as we will implement later. -A drawback of a linked list is that if you want to insert/delete an element at the end of the list, you would have to navigate the whole collection to find the last one O(n). However, this can be solved by keeping track of the last element in the list. We are going to implement that! +A drawback of a linked list is that if you want to insert/delete an element at the end of the list, you would have to navigate the whole collection to find the last one: O(n). However, this can be solved by keeping track of the last element in the list. We are going to implement that! ==== Implementing a Linked List @@ -74,7 +74,7 @@ In our constructor, we keep a reference of the `first` and also `last` node for ==== Searching by value -Finding an element by value there’s no other way than iterating through the whole list. +There’s no other way to find an element by value than iterating through the entire list. .Linked List's searching by values [source, javascript] @@ -109,7 +109,7 @@ Searching by index is very similar, we iterate through the list until we find th include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex, indent=0] ---- -If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. +If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation, https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. ==== Insertion @@ -162,7 +162,7 @@ For inserting an element at the middle of the list, you would need to specify th . New node's next `previous`. -Let’s do an example, with the following doubly linked list: +Let’s do an example with the following doubly linked list: ---- art <-> dog <-> cat @@ -181,14 +181,14 @@ Take a look into the implementation of https://github.com/amejiarosario/dsa.js/b include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, indent=0] ---- <1> If the new item goes to position 0, then we reuse the `addFirst` method, and we are done! -<2> However, If we are adding to the last position, then we reuse the `addLast` method, and done! +<2> However, if we are adding to the last position, then we reuse the `addLast` method, and done! <3> Adding `newNode` to the middle: First, create the `new` node only if the position exists. Take a look at <> to see `get` implementation. <4> Set newNode `previous` reference. <5> Set newNode `next` link. <6> No other node in the list is pointing to `newNode`, so we have to make the prior element point to `newNode`. <7> Make the next element point to `newNode`. -Take notice that we reused, `addFirst` and `addLast` methods. For all the other cases the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting on the middle takes *O(n)* because we have to iterate through the list using the `get` method. +Take notice that we reused `addFirst` and `addLast` methods. For all the other cases, the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting in the middle takes *O(n)* because we have to iterate through the list using the `get` method. ==== Deletion @@ -201,7 +201,7 @@ Deleting the first element (or head) is a matter of removing all references to i .Deleting an element from the head of the list image::image26.png[image,width=528,height=74] -For instance, to remove the head (“art”) node, we change the variable `first` to point to the second node “dog”. We also remove the variable `previous` from the "dog" node, so it doesn't point to the “art” node. The garbage collector will get rid of the “art” node when it seems nothing is using it anymore. +For instance, to remove the head (“art”) node, we change the variable `first` to point to the second node “dog”. We also remove the variable `previous` from the "dog" node, so it doesn't point to the “art” node. The garbage collector will get rid of the “art” node when it sees nothing is using it anymore. .Linked List's remove from the beginning of the list [source, javascript] @@ -209,17 +209,17 @@ For instance, to remove the head (“art”) node, we change the variable `first include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeFirst, indent=0] ---- -As you can see, when we want to remove the first node we make the 2nd element the first one. +As you can see, when we want to remove the first node, we make the 2nd element the first one. ===== Deleting element from the tail -Removing the last element from the list would require to iterate from the head until we find the last one, that’s O(n). But, If we have a reference to the last element, which we do, We can do it in _O(1)_ instead! +Removing the last element from the list would require to iterate from the head until we find the last one, that’s O(n). But, if we have a reference to the last element, which we do, we can do it in _O(1)_ instead! .Removing last element from the list using the last reference. image::image27.png[image,width=528,height=221] -For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat” then is out of the list and eventually is deleted from memory by the garbage collector. +For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat”, it is out of the list and eventually is deleted from memory by the garbage collector. .Linked List's remove from the end of the list [source, javascript] @@ -238,7 +238,7 @@ To remove a node from the middle, we make the surrounding nodes to bypass the on image::image28.png[image,width=528,height=259] -In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art” totally bypassing “dog”. +In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art”, totally bypassing “dog”. Let’s implement it: @@ -261,14 +261,14 @@ So far, we have seen two liner data structures with different use cases. Here’ .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ | Array ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) -| Linked List (singly) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) +| Linked List (singly) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) | Linked List (doubly) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(1) ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) |=== // end::table[] (((Linear))) (((Runtime, Linear))) -If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is deleting elements from the end. For a singly list is *O(n)*, while for a doubly list is *O(1)*. +If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly linked list is *O(1)*. Comparing an array with a doubly linked list, both have different use cases: @@ -284,4 +284,4 @@ Use a doubly linked list when: * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). * You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start perform better on linked-list, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we are going use that. diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 62d50ff2..aab404a7 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -24,7 +24,7 @@ We could use an array or a linked list to implement a Queue. However, it is reco [source, javascript] ---- include::{codedir}/data-structures/queues/queue.js[tag=constructor] - // ... methods goes here ... + // ... methods go here ... } ---- @@ -32,7 +32,7 @@ We initialize the Queue creating a linked list. Now, let’s add the `enqueue` a ==== Insertion (((Enqueue))) -For inserting elements on queue, also know as *enqueue*, we add items to the back of the list using `addLast`: +For inserting elements into a queue, also know as *enqueue*, we add items to the back of the list using `addLast`: .Queue's enqueue [source, javascript] @@ -44,7 +44,7 @@ As discussed, this operation has a constant runtime. ==== Deletion (((Dequeue))) -For removing elements from a queue, also know as *dequeue*, we remove elements from the front of the list using `removeFirst`: +For removing elements from a queue, also known as *dequeue*, we remove elements from the front of the list using `removeFirst`: .Queue's dequeue [source, javascript] @@ -64,7 +64,7 @@ We can use our Queue class like follows: include::{codedir}/data-structures/queues/queue.js[tag=snippet, indent=0] ---- -You can see that the items are dequeue in the same order they were added, FIFO (first-in, first out). +You can see that the items are dequeued in the same order they were added, FIFO (first-in, first out). ==== Queue Complexity diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 09b8a741..81ced6f2 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -11,16 +11,16 @@ endif::[] (((LIFO))) The stack is a data structure that restricts the way you add and remove data. It only allows you to insert and retrieve in a *Last-In-First-Out* (LIFO) fashion. -An analogy is to think the stack is a rod and the data are discs. You can only take out the last one you put in. +An analogy is to think that the stack is a rod and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out image::image29.png[image,width=240,height=238] // #Change image from https://www.khanacademy.org/computing/computer-science/algorithms/towers-of-hanoi/a/towers-of-hanoi[Khan Academy]# -As you can see in the image above, If you insert the disks in the order `5`, `4`, `3`, `2`, `1`. Then you can remove them on `1`, `2`, `3`, `4`, `5`. +As you can see in the image above, If you insert the disks in the order `5`, `4`, `3`, `2`, `1`, then you can remove them in `1`, `2`, `3`, `4`, `5`. -The stack inserts items to the end of the collection and also removes from the end. Both, an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. +The stack inserts items to the end of the collection and also removes from the end. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. .Stack's constructor [source, javascript] @@ -84,4 +84,4 @@ Implementing the stack with an array and linked list would lead to the same time |=== // end::table[] -It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks especially useful for implementing <>. +It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks are especially useful for implementing <>. diff --git a/book/content/preface.asc b/book/content/preface.asc index 7e03dcd6..bb780633 100644 --- a/book/content/preface.asc +++ b/book/content/preface.asc @@ -3,15 +3,15 @@ === What is in this book? -_{doctitle}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or looking for ideas to solve a problem optimally. (Check out the <> and <>) +_{doctitle}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or look for ideas to solve a problem optimally. (Check out the <> and <>) -This publication is designed to be concise, intending to serve software developers looking to get a firm conceptual understanding of data structures in a quick yet in-depth fashion. After reading this book, the reader should have a fundamental knowledge of algorithms, including when and where to apply it, what are the trade-offs of using one data structure over the other. The reader will then be able to make intelligent decisions about algorithms and data structures in their projects require. +This publication is designed to be concise, intending to serve software developers looking to get a firm conceptual understanding of data structures in a quick yet in-depth fashion. After reading this book, the reader should have a fundamental knowledge of algorithms, including when and where to apply it, what are the trade-offs of using one data structure over the other. The reader will then be able to make intelligent decisions about algorithms and data structures in their projects. === Who this book is for This book is for software developers familiar with JavaScript looking to improve their problem-solving skills or preparing for a job interview. -NOTE: You can apply the concepts in this book to any programming language. However, instead of doing examples in pseudo-code we are going to use JavaScript to implement the code examples. +NOTE: You can apply the concepts in this book to any programming language. However, instead of doing examples in pseudo-code, we are going to use JavaScript to implement the code examples. === What you need for this book diff --git a/book/part02-linear-data-structures.asc b/book/part02-linear-data-structures.asc index ad0db79e..ca76e78a 100644 --- a/book/part02-linear-data-structures.asc +++ b/book/part02-linear-data-structures.asc @@ -3,7 +3,7 @@ Data Structures comes in many flavors. There’s no one to rule them all. You have to know the tradeoffs so you can choose the right one for the job. -Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you how when to use over the other or even tweak them to create a new one. We are going to explore the most common data structures time and space complexity. +Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you know when to use one over the other or even tweak them to create a new one. We are going to explore the most common data structures' time and space complexity. .In this part we are going to learn about the following linear data structures: - <> diff --git a/src/data-structures/queues/queue.js b/src/data-structures/queues/queue.js index 2ef458a8..9b4e4bd9 100644 --- a/src/data-structures/queues/queue.js +++ b/src/data-structures/queues/queue.js @@ -2,7 +2,7 @@ const LinkedList = require('../linked-lists/linked-list'); // tag::constructor[] /** - * Data structure where add and remove elements in a first-in, first-out (FIFO) + * Data structure where we add and remove elements in a first-in, first-out (FIFO) fashion */ class Queue { constructor() { From 9c36253ca49e035ec7c33b07a99e51e8a062ce99 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 23 Mar 2020 11:00:41 -0400 Subject: [PATCH 045/200] style(book): better wording for table --- book/content/part01/algorithms-analysis.asc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index 0309e69c..52f57c03 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -59,10 +59,10 @@ To give you a clearer picture of how different algorithms perform as the input s |============================================================================================= |Input size -> |10 |100 |10k |100k |1M |Finding if a number is odd |< 1 sec. |< 1 sec. |< 1 sec. |< 1 sec. |< 1 sec. -|Sorting elements in array with merge sort |< 1 sec. |< 1 sec. |< 1 sec. |few sec. |20 sec. -|Sorting elements in array with Bubble Sort |< 1 sec. |< 1 sec. |2 minutes |3 hours |12 days -|Finding all subsets of a given set |< 1 sec. |40,170 trillion years |> centillion years |∞ |∞ -|Find all permutations of a string |4 sec. |> vigintillion years |> centillion years |∞ |∞ +|Sorting array with merge sort |< 1 sec. |< 1 sec. |< 1 sec. |few sec. |20 sec. +|Sorting array with Selection Sort |< 1 sec. |< 1 sec. |2 minutes |3 hours |12 days +|Finding all subsets |< 1 sec. |40,170 trillion years |> centillion years |∞ |∞ +|Finding string permutations |4 sec. |> vigintillion years |> centillion years |∞ |∞ |============================================================================================= Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. From 18b699eb8a9fa34640bea89cf1d8796b073070a4 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 23 Mar 2020 11:04:30 -0400 Subject: [PATCH 046/200] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c1fc41e0..2297df68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.9", + "version": "1.3.10", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 16005f3bf39597759918e34b39d27eb25a5755e7 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 22 Mar 2020 13:55:10 -0400 Subject: [PATCH 047/200] feat(trie): remove method --- src/data-structures/trees/trie-1.js | 48 ++++++++++++++++++++++ src/data-structures/trees/trie.js | 34 ++++++++++++++++ src/data-structures/trees/trie.spec.js | 55 ++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/src/data-structures/trees/trie-1.js b/src/data-structures/trees/trie-1.js index 80ede3b0..ce328b5a 100644 --- a/src/data-structures/trees/trie-1.js +++ b/src/data-structures/trees/trie-1.js @@ -67,6 +67,54 @@ class Trie { return words; } + + /** + * Return true if found the word to be removed, otherwise false. + * Iterative approach + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove(word) { + const stack = []; + let curr = this; + + for (const char of word) { + if (!curr.children[char]) { return false; } + stack.push(curr); + curr = curr.children[char]; + } + + if (!curr.isWord) { return false; } + let node = stack.pop(); + + do { + node.children = {}; + node = stack.pop(); + } while (node && !node.isWord); + + return true; + } + + /** + * Return true if found the word to be removed, otherwise false. + * recursive approach + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove2(word, i = 0, parent = this) { + if (i === word.length - 1) { + return true; + } + const child = parent.children[word.charAt(i)]; + if (!child) return false; + + const found = this.remove(word, i + 1, child); + + if (found) { + delete parent.children[word.charAt(i)]; + } + return true; + } } // Aliases diff --git a/src/data-structures/trees/trie.js b/src/data-structures/trees/trie.js index b634443b..1a03c241 100644 --- a/src/data-structures/trees/trie.js +++ b/src/data-structures/trees/trie.js @@ -21,6 +21,40 @@ class Trie { curr.isWord = true; } + /** + * Return true if found the word to be removed, otherwise false. + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove(word) { + return this.removeHelper(word); + } + + /** + * Remove word from trie, return true if found, otherwise false. + * @param {string} word - The word to remove. + * @param {Trie} parent - The parent node. + * @param {number} index - The index. + * @param {number} meta.stop - Keeps track of the last letter that won't be removed. + * @returns {boolean} + */ + removeHelper(word, parent = this, index = 0, meta = { stop: 0 }) { + if (index === word.length) { + parent.isWord = false; + if (Object.keys(parent.children)) { meta.stop = index; } + return true; + } + const child = parent.children[word.charAt(index)]; + if (!child) { return false; } + if (parent.isWord) { meta.stop = index; } + const found = this.removeHelper(word, child, index + 1, meta); + // deletes all the nodes beyond `meta.stop`. + if (found && index >= meta.stop) { + delete parent.children[word.charAt(index)]; + } + return found; + } + /** * Retun last node that matches word or prefix or false if not found. * @param {string} word - Word to search. diff --git a/src/data-structures/trees/trie.spec.js b/src/data-structures/trees/trie.spec.js index f72f7adf..fca6588e 100644 --- a/src/data-structures/trees/trie.spec.js +++ b/src/data-structures/trees/trie.spec.js @@ -69,6 +69,13 @@ describe('Trie', () => { expect(trie.startsWith('do')).toEqual(true); }); + it('should match full words if partial is set', () => { + expect(trie.search('dogs', { + partial: true, + })).toEqual(true); + expect(trie.startsWith('dogs')).toEqual(true); + }); + it('should not match non existing words', () => { expect(trie.search('doors')).toEqual(false); }); @@ -129,5 +136,53 @@ describe('Trie', () => { expect(words).toEqual([]); }); }); + + describe('remove', () => { + it('should remove a word', () => { + trie = new Trie(); + trie.insert('a'); + expect(trie.remove('a')).toEqual(true); + expect(trie.getAllWords()).toEqual([]); + }); + + it('should remove word and keep other words', () => { + trie = new Trie(); + trie.insert('a'); + trie.insert('ab'); + expect(trie.remove('a')).toEqual(true); + expect(trie.getAllWords()).toEqual(['ab']); + }); + + it('should remove surrounding word', () => { + trie = new Trie(); + trie.insert('a'); + trie.insert('ab'); + expect(trie.remove('ab')).toEqual(true); + expect(trie.getAllWords()).toEqual(['a']); + }); + + it('should return false when word is not found', () => { + expect(trie.remove('not there')).toBe(false); + }); + + it('should remove words in between and still match', () => { + expect(trie.remove('dog')).toBe(true); + expect(trie.search('dogs')).toBe(true); + expect(trie.startsWith('dog')).toBe(true); + expect(trie.getAllWords()).toEqual([ + 'dogs', 'door', 'day', 'cat', + ]); + }); + + it('should remove word and no longer match partials', () => { + expect(trie.remove('dogs')).toBe(true); + expect(trie.search('dogs')).toBe(false); + expect(trie.search('dog')).toBe(true); + expect(trie.startsWith('dog')).toBe(true); + expect(trie.getAllWords()).toEqual([ + 'dog', 'door', 'day', 'cat', + ]); + }); + }); }); }); From eac045a6bedd0223a2e8b12225f87c428e6fb66f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 26 Mar 2020 21:26:28 -0400 Subject: [PATCH 048/200] feat(linkedList): remove by node --- .../linked-lists/linked-list.js | 19 +++++++++++++ .../linked-lists/linked-list.spec.js | 27 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/data-structures/linked-lists/linked-list.js b/src/data-structures/linked-lists/linked-list.js index 191ef164..5da9e56f 100644 --- a/src/data-structures/linked-lists/linked-list.js +++ b/src/data-structures/linked-lists/linked-list.js @@ -265,6 +265,25 @@ class LinkedList { return false; } + /** + * Remove element by Node + * O(1) + */ + removeByNode(node) { + if (!node) { return null; } + if (node === this.first) { + return this.removeFirst(); + } + if (node === this.last) { + return this.removeLast(); + } + node.previous.next = node.next; + node.next.previous = node.previous; + this.size -= 1; + + return node.value; + } + /** * Iterate through the list yield on each node * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#User-defined_iterables diff --git a/src/data-structures/linked-lists/linked-list.spec.js b/src/data-structures/linked-lists/linked-list.spec.js index 288412c1..9026db8e 100644 --- a/src/data-structures/linked-lists/linked-list.spec.js +++ b/src/data-structures/linked-lists/linked-list.spec.js @@ -223,6 +223,33 @@ describe('LinkedList Test', () => { expect(linkedList.length).toBe(1); }); }); + + describe('#removeByNode', () => { + it('should remove first node', () => { + const node = linkedList.first; + linkedList.removeByNode(node); + expect(linkedList.first.value).toEqual('found'); + expect(linkedList.first.previous).toEqual(null); + expect(linkedList.size).toEqual(1); + }); + + it('should remove last node', () => { + const node = linkedList.last; + linkedList.removeByNode(node); + expect(linkedList.first.value).toEqual(0); + expect(linkedList.first.next).toEqual(null); + expect(linkedList.size).toEqual(1); + }); + + it('should remove from the middle', () => { + const node = linkedList.first; + linkedList.addLast('last'); + linkedList.removeByNode(node); + expect(linkedList.first.next).toEqual(linkedList.last); + expect(linkedList.last.previous).toEqual(linkedList.first); + expect(linkedList.size).toEqual(2); + }); + }); }); describe('Doubly Linked List and aliases', () => { From 3e787c6f9ba9c094272be5ac05b997ce44a359d3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 26 Mar 2020 21:27:09 -0400 Subject: [PATCH 049/200] feat(lru-cache): add new implementations --- .../01-arrays/longest-unique-characters.js | 72 ++++++++++++ src/data-structures/custom/lru-cache-1.js | 29 +---- src/data-structures/custom/lru-cache-2.js | 72 ++++++++++++ src/data-structures/custom/lru-cache-3.js | 51 +++++++++ src/data-structures/custom/lru-cache.js | 39 ++----- src/data-structures/custom/lru-cache.spec.js | 108 ++++++++++++++++++ 6 files changed, 314 insertions(+), 57 deletions(-) create mode 100644 lab/exercises/01-arrays/longest-unique-characters.js create mode 100644 src/data-structures/custom/lru-cache-2.js create mode 100644 src/data-structures/custom/lru-cache-3.js create mode 100644 src/data-structures/custom/lru-cache.spec.js diff --git a/lab/exercises/01-arrays/longest-unique-characters.js b/lab/exercises/01-arrays/longest-unique-characters.js new file mode 100644 index 00000000..895e4e91 --- /dev/null +++ b/lab/exercises/01-arrays/longest-unique-characters.js @@ -0,0 +1,72 @@ +/** + * @param {string} s + * @return {number} + */ +function lengthOfLongestSubstring(s) { + let max = 0; + let start = 0; + const map = {}; + + for (let i = 0; i < s.length; i++) { + const char = s[i]; + + if (map[char]) { + start = map[char] + 1; + } + + map[char] = i; + max = Math.max(1 + i - start, max); + } + + return max; +} + +const assert = require('assert'); + +const testCases = { abcabcbb: 3 }; + +for (const [string, unique] of Object.entries(testCases)) { + assert.equal(lengthOfLongestSubstring(string), unique); +} + +/* + Longest string without duplicate chars. + + "abcabcbb" + 3 (abc) + + i=6 + c=b + s=5 + h={a:3,b:4,c:2} + m=3 + + --- + a + 1 + + aa + 1 + + ab + 2 + + abc + 3 + + aab + 2 + + aabca + 3 + + "dvdf" + 3 (vdf) + + "abcabcbb" + 3 (abc) + --- + + map: O(n) + backtracking +*/ diff --git a/src/data-structures/custom/lru-cache-1.js b/src/data-structures/custom/lru-cache-1.js index d6453b5d..521559a6 100644 --- a/src/data-structures/custom/lru-cache-1.js +++ b/src/data-structures/custom/lru-cache-1.js @@ -1,30 +1,7 @@ - /** - * Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put. - - get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1. - put(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item. - - Follow up: - Could you do both operations in O(1) time complexity? - - Example: - - LRUCache cache = new LRUCache( 2); - - cache.put(1, 1); - cache.put(2, 2); - cache.get(1); // returns 1 - cache.put(3, 3); // evicts key 2 - cache.get(2); // returns -1 (not found) - cache.put(4, 4); // evicts key 1 - cache.get(1); // returns -1 (not found) - cache.get(3); // returns 3 - cache.get(4); // returns 4 - - * https://leetcode.com/problems/lru-cache/description/ - * - * @param {number} capacity + * Least Recently Used (LRU) cache. + * Map + Array: O(n) + * @param {number} capacity - Number of items to hold. */ const LRUCache = function (capacity) { this.map = new Map(); diff --git a/src/data-structures/custom/lru-cache-2.js b/src/data-structures/custom/lru-cache-2.js new file mode 100644 index 00000000..b07a4b6b --- /dev/null +++ b/src/data-structures/custom/lru-cache-2.js @@ -0,0 +1,72 @@ +/** + * Least Recently Used (LRU) cache. + * Map + (Hash)Set: O(1) + * @param {number} capacity - Number of items to hold. + */ +var LRUCache = function(capacity) { + this.capacity = capacity || 2; + this.map = new Map(); + this.set = new Set(); + this.size = 0; +}; + +/** + * @param {number} key + * @return {number} + */ +LRUCache.prototype.get = function(key) { + if (!this.map.has(key)) return -1; + // move to top + this.set.delete(key); + this.set.add(key); + + return this.map.get(key); +}; + +/** + * @param {number} key + * @param {number} value + * @return {void} + */ +LRUCache.prototype.put = function(key, value) { + this.map.set(key, value); + // move to top + this.set.delete(key); + this.set.add(key); + + if (this.set.size > this.capacity) { + const leastUsedKey = this.set.values().next().value; + this.map.delete(leastUsedKey); + this.set.delete(leastUsedKey); + } + + this.size = this.map.size; +}; + +/** + * Your LRUCache object will be instantiated and called as such: + * var obj = new LRUCache(capacity) + * var param_1 = obj.get(key) + * obj.put(key,value) + */ + + +/* + Implement a hashMap cache with a given capacity that once reach deletes the least used element and store the new one. + + --- + + c = new LRUCache(2); + c.put(1,1); + c.put(2,2); + c.put(3,3); // deletes key 1 + + c = new LRUCache(2); + c.put(1,1); + c.put(2,2); + c.get(1); + c.put(3,3); // deletes key 2 + +*/ + +module.exports = LRUCache; diff --git a/src/data-structures/custom/lru-cache-3.js b/src/data-structures/custom/lru-cache-3.js new file mode 100644 index 00000000..506ffcce --- /dev/null +++ b/src/data-structures/custom/lru-cache-3.js @@ -0,0 +1,51 @@ +const DLinkedList = require('../linked-lists/linked-list'); +/** + * Least Recently Used (LRU) cache. + * Map + Double LinkedList: O(1) + * @param {number} capacity - Number of items to hold. + */ +class LRUCache extends Map { + constructor(capacity) { + super(); // initialize map + this.capacity = capacity; + this.list = new DLinkedList(); + } + + get(key) { + if (!super.has(key)) { return -1; } + + // console.log('get', {key}); + const node = super.get(key); + this.moveToHead(key, node); + + return node.value.value; + } + + put(key, value) { + // console.log('put', {key, value}); + let node; + if (super.has(key)) { + node = super.get(key); + node.value.value = value; + } else { + node = this.list.addLast({key, value}); + } + this.moveToHead(key, node); + + if (this.list.size > this.capacity) { + const firstNode = this.list.removeFirst(); + super.delete(firstNode.key); + } + } + + moveToHead(key, node) { + // remove node and put it in front + this.list.removeByNode(node); + const newNode = this.list.addLast(node.value); + super.set(key, newNode); + // console.log('\tlist', Array.from(this.list).map(l => l.node.value)); + // console.log('\tlist', Array.from(this.list).map(l => l.node.value.key)); + } +} + +module.exports = LRUCache; diff --git a/src/data-structures/custom/lru-cache.js b/src/data-structures/custom/lru-cache.js index 13638b6c..2907f8e6 100644 --- a/src/data-structures/custom/lru-cache.js +++ b/src/data-structures/custom/lru-cache.js @@ -1,34 +1,7 @@ /** - * Design and implement a data structure for Least Recently Used (LRU) cache. - * It should support the following operations: get and put. - - get(key) - Get the value (will always be positive) of the key - if the key exists in the cache, otherwise return -1. - put(key, value) - Set or insert the value if the key is not already present. - When the cache reached its capacity, it should invalidate the least - recently used item before inserting a new item. - - Follow up: - Could you do both operations in O(1) time complexity? - - Example: - - LRUCache cache = new LRUCache( 2); - - cache.put(1, 1); - cache.put(2, 2); - cache.get(1); // returns 1 - cache.put(3, 3); // evicts key 2 - cache.get(2); // returns -1 (not found) - cache.put(4, 4); // evicts key 1 - cache.get(1); // returns -1 (not found) - cache.get(3); // returns 3 - cache.get(4); // returns 4 - - * https://leetcode.com/problems/lru-cache/description/ - * https://leetcode.com/submissions/detail/178329173/ - * - * @param {number} capacity + * Least Recently Used (LRU) cache. + * (ordered) Map: O(1) + * @param {number} capacity - Number of items to hold. */ class LRUCache { constructor(capacity) { @@ -53,7 +26,7 @@ class LRUCache { rotate(key) { this.moveToTop(key); while (this.map.size > this.capacity) { - const it = this.map.keys(); + const it = this.map.keys(); // keys are in insertion order. this.map.delete(it.next().value); } } @@ -65,6 +38,10 @@ class LRUCache { this.map.set(key, value); } } + + get size() { + return this.map.size; + } } module.exports = LRUCache; diff --git a/src/data-structures/custom/lru-cache.spec.js b/src/data-structures/custom/lru-cache.spec.js new file mode 100644 index 00000000..73368627 --- /dev/null +++ b/src/data-structures/custom/lru-cache.spec.js @@ -0,0 +1,108 @@ +const LRUCache = require('./lru-cache-3'); + +describe('LRU Cache', () => { + let c; + + describe('#constructor', () => { + it('should initialize', () => { + c = new LRUCache(); + expect(c).toBeDefined(); + }); + + it('should initialize', () => { + c = new LRUCache(7); + expect(c.capacity).toEqual(7); + }); + }); + + describe('when initialized', () => { + beforeEach(() => { + c = new LRUCache(2); + }); + + describe('#put', () => { + it('should insert new elements', () => { + c.put(1, 1); + expect(c.size).toEqual(1); + }); + + it('should update existing element', () => { + c.put(1, 1); + c.put(1, 2); + expect(c.size).toEqual(1); + }); + }); + + describe('#get', () => { + it('should get element', () => { + c.put(1, 1); + expect(c.get(1)).toEqual(1); + }); + + it('should return -1 for non-existing elements', () => { + expect(c.get(1)).toEqual(-1); + }); + + it('should not add non-existing number to the top of the list', () => { + c.put(1, 1); + expect(c.get(8)).toEqual(-1); + c.put(2, 2); + expect(c.get(9)).toEqual(-1); + expect(c.get(1)).toEqual(1); + expect(c.get(2)).toEqual(2); + }); + + it('should return -1 for removed elements', () => { + c.put(1, 1); + c.put(2, 2); + c.put(3, 3); + expect(c.get(1)).toEqual(-1); + }); + + it('should not remove value if accessed recently', () => { + c.put(1, 1); + c.put(2, 2); + expect(c.get(1)).toEqual(1); + c.put(3, 3); + expect(c.get(1)).toEqual(1); + expect(c.get(2)).toEqual(-1); + }); + + it('should update a value', () => { + c.put(1, 1); + c.put(1, 2); + expect(c.get(1)).toEqual(2); + }); + }); + + it('should work with size 10', () => { + c = new LRUCache(10); + + c.put(10, 13); + c.put(3, 17); + c.put(6, 11); + c.put(10, 5); + c.put(9, 10); + expect(c.get(13)).toEqual(-1); + c.put(2, 19); + expect(c.get(2)).toEqual(19); + expect(c.get(3)).toEqual(17); + c.put(5, 25); + expect(c.get(8)).toEqual(-1); + c.put(9, 22); + c.put(5, 5); + c.put(1, 30); + expect(c.get(11)).toEqual(-1); + c.put(9, 12); + expect(c.get(7)).toEqual(-1); + expect(c.get(5)).toEqual(5); + expect(c.get(8)).toEqual(-1); + expect(c.get(9)).toEqual(12); + c.put(4, 30); + c.put(9, 3); + expect(c.get(9)).toEqual(3); + expect(c.get(10)).toEqual(5); + expect(c.get(10)).toEqual(5); + }); + }); +}); From a81f6e1d57ee07d8ee1dc6b5abb2f6486cb15505 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 22 Mar 2020 13:55:10 -0400 Subject: [PATCH 050/200] feat(trie): remove method --- src/data-structures/trees/trie-1.js | 48 ++++++++++++++++++++++ src/data-structures/trees/trie.js | 34 ++++++++++++++++ src/data-structures/trees/trie.spec.js | 55 ++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/src/data-structures/trees/trie-1.js b/src/data-structures/trees/trie-1.js index 80ede3b0..fb6ed1bf 100644 --- a/src/data-structures/trees/trie-1.js +++ b/src/data-structures/trees/trie-1.js @@ -67,6 +67,54 @@ class Trie { return words; } + + /** + * Return true if found the word to be removed, otherwise false. + * Iterative approach + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove(word) { + const stack = []; + let curr = this; + + for (const char of word) { + if (!curr.children[char]) { return false; } + stack.push(curr); + curr = curr.children[char]; + } + + if (!curr.isWord) { return false; } + let node = stack.pop(); + + do { + node.children = {}; + node = stack.pop(); + } while (node && !node.isWord); + + return true; + } + + /** + * Return true if found the word to be removed, otherwise false. + * recursive approach + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove2(word, i = 0, parent = this) { + if (i === word.length - 1) { + return true; + } + const child = parent.children[word.charAt(i)]; + if (!child) return false; + + const found = this.remove(word, i + 1, child); + + if (found) { + delete parent.children[word.charAt(i)]; + } + return true; + } } // Aliases diff --git a/src/data-structures/trees/trie.js b/src/data-structures/trees/trie.js index b634443b..1a03c241 100644 --- a/src/data-structures/trees/trie.js +++ b/src/data-structures/trees/trie.js @@ -21,6 +21,40 @@ class Trie { curr.isWord = true; } + /** + * Return true if found the word to be removed, otherwise false. + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove(word) { + return this.removeHelper(word); + } + + /** + * Remove word from trie, return true if found, otherwise false. + * @param {string} word - The word to remove. + * @param {Trie} parent - The parent node. + * @param {number} index - The index. + * @param {number} meta.stop - Keeps track of the last letter that won't be removed. + * @returns {boolean} + */ + removeHelper(word, parent = this, index = 0, meta = { stop: 0 }) { + if (index === word.length) { + parent.isWord = false; + if (Object.keys(parent.children)) { meta.stop = index; } + return true; + } + const child = parent.children[word.charAt(index)]; + if (!child) { return false; } + if (parent.isWord) { meta.stop = index; } + const found = this.removeHelper(word, child, index + 1, meta); + // deletes all the nodes beyond `meta.stop`. + if (found && index >= meta.stop) { + delete parent.children[word.charAt(index)]; + } + return found; + } + /** * Retun last node that matches word or prefix or false if not found. * @param {string} word - Word to search. diff --git a/src/data-structures/trees/trie.spec.js b/src/data-structures/trees/trie.spec.js index f72f7adf..fca6588e 100644 --- a/src/data-structures/trees/trie.spec.js +++ b/src/data-structures/trees/trie.spec.js @@ -69,6 +69,13 @@ describe('Trie', () => { expect(trie.startsWith('do')).toEqual(true); }); + it('should match full words if partial is set', () => { + expect(trie.search('dogs', { + partial: true, + })).toEqual(true); + expect(trie.startsWith('dogs')).toEqual(true); + }); + it('should not match non existing words', () => { expect(trie.search('doors')).toEqual(false); }); @@ -129,5 +136,53 @@ describe('Trie', () => { expect(words).toEqual([]); }); }); + + describe('remove', () => { + it('should remove a word', () => { + trie = new Trie(); + trie.insert('a'); + expect(trie.remove('a')).toEqual(true); + expect(trie.getAllWords()).toEqual([]); + }); + + it('should remove word and keep other words', () => { + trie = new Trie(); + trie.insert('a'); + trie.insert('ab'); + expect(trie.remove('a')).toEqual(true); + expect(trie.getAllWords()).toEqual(['ab']); + }); + + it('should remove surrounding word', () => { + trie = new Trie(); + trie.insert('a'); + trie.insert('ab'); + expect(trie.remove('ab')).toEqual(true); + expect(trie.getAllWords()).toEqual(['a']); + }); + + it('should return false when word is not found', () => { + expect(trie.remove('not there')).toBe(false); + }); + + it('should remove words in between and still match', () => { + expect(trie.remove('dog')).toBe(true); + expect(trie.search('dogs')).toBe(true); + expect(trie.startsWith('dog')).toBe(true); + expect(trie.getAllWords()).toEqual([ + 'dogs', 'door', 'day', 'cat', + ]); + }); + + it('should remove word and no longer match partials', () => { + expect(trie.remove('dogs')).toBe(true); + expect(trie.search('dogs')).toBe(false); + expect(trie.search('dog')).toBe(true); + expect(trie.startsWith('dog')).toBe(true); + expect(trie.getAllWords()).toEqual([ + 'dog', 'door', 'day', 'cat', + ]); + }); + }); }); }); From e31cc62b0d075a7479b35876a75e3a58d43ecfdb Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 26 Mar 2020 21:52:27 -0400 Subject: [PATCH 051/200] feat(trie): feature complete --- src/data-structures/trees/trie-2.js | 133 +++++++++++++++++++++++++ src/data-structures/trees/trie.js | 45 ++++----- src/data-structures/trees/trie.spec.js | 2 +- src/index.js | 3 + 4 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 src/data-structures/trees/trie-2.js diff --git a/src/data-structures/trees/trie-2.js b/src/data-structures/trees/trie-2.js new file mode 100644 index 00000000..1a03c241 --- /dev/null +++ b/src/data-structures/trees/trie-2.js @@ -0,0 +1,133 @@ +class Trie { + constructor(val) { + this.val = val; + this.children = {}; + this.isWord = false; + } + + /** + * Insert word into trie and mark last element as such. + * @param {string} word + * @return {undefined} + */ + insert(word) { + let curr = this; + + for (const char of word) { + curr.children[char] = curr.children[char] || new Trie(char); + curr = curr.children[char]; + } + + curr.isWord = true; + } + + /** + * Return true if found the word to be removed, otherwise false. + * @param {string} word - The word to remove + * @returns {boolean} + */ + remove(word) { + return this.removeHelper(word); + } + + /** + * Remove word from trie, return true if found, otherwise false. + * @param {string} word - The word to remove. + * @param {Trie} parent - The parent node. + * @param {number} index - The index. + * @param {number} meta.stop - Keeps track of the last letter that won't be removed. + * @returns {boolean} + */ + removeHelper(word, parent = this, index = 0, meta = { stop: 0 }) { + if (index === word.length) { + parent.isWord = false; + if (Object.keys(parent.children)) { meta.stop = index; } + return true; + } + const child = parent.children[word.charAt(index)]; + if (!child) { return false; } + if (parent.isWord) { meta.stop = index; } + const found = this.removeHelper(word, child, index + 1, meta); + // deletes all the nodes beyond `meta.stop`. + if (found && index >= meta.stop) { + delete parent.children[word.charAt(index)]; + } + return found; + } + + /** + * Retun last node that matches word or prefix or false if not found. + * @param {string} word - Word to search. + * @param {boolean} options.partial - Whether or not match partial matches. + * @return {Trie|false} + */ + searchNode(word) { + let curr = this; + + for (const char of word) { + if (!curr.children[char]) { return false; } + curr = curr.children[char]; + } + + return curr; + } + + /** + * Search for complete word (by default) or partial if flag is set. + * @param {string} word - Word to search. + * @param {boolean} options.partial - Whether or not match partial matches. + * @return {boolean} + */ + search(word, { partial } = {}) { + const curr = this.searchNode(word); + if (!curr) { return false; } + return partial ? true : curr.isWord; + } + + /** + * Return true if any word on the trie starts with the given prefix + * @param {string} prefix - Partial word to search. + * @return {boolean} + */ + startsWith(prefix) { + return this.search(prefix, { partial: true }); + } + + /** + * Returns all the words from the current `node`. + * Uses backtracking. + * + * @param {string} prefix - The prefix to append to each word. + * @param {string} node - Current node to start backtracking. + */ + getAllWords(prefix = '', node = this) { + let words = []; + + if (!node) { return words; } + if (node.isWord) { + words.push(prefix); + } + + for (const char of Object.keys(node.children)) { + const newWords = this.getAllWords(`${prefix}${char}`, node.children[char]); + words = words.concat(newWords); + } + + return words; + } + + /** + * Return a list of words matching the prefix + * @param {*} prefix - The prefix to match. + * @returns {string[]} + */ + autocomplete(prefix = '') { + const curr = this.searchNode(prefix); + return this.getAllWords(prefix, curr); + } +} + +// Aliases +Trie.prototype.add = Trie.prototype.insert; + +module.exports = Trie; diff --git a/src/data-structures/trees/trie.js b/src/data-structures/trees/trie.js index 1a03c241..77fa5b57 100644 --- a/src/data-structures/trees/trie.js +++ b/src/data-structures/trees/trie.js @@ -27,32 +27,31 @@ class Trie { * @returns {boolean} */ remove(word) { - return this.removeHelper(word); - } + let curr = this; + // let lastWordToKeep = 0; + const stack = [curr]; - /** - * Remove word from trie, return true if found, otherwise false. - * @param {string} word - The word to remove. - * @param {Trie} parent - The parent node. - * @param {number} index - The index. - * @param {number} meta.stop - Keeps track of the last letter that won't be removed. - * @returns {boolean} - */ - removeHelper(word, parent = this, index = 0, meta = { stop: 0 }) { - if (index === word.length) { - parent.isWord = false; - if (Object.keys(parent.children)) { meta.stop = index; } - return true; + // find word and stack path + for (const char of word) { + if (!curr.children[char]) { return false; } + // lastWordToKeep += 1; + curr = curr.children[char]; + stack.push(curr); } - const child = parent.children[word.charAt(index)]; - if (!child) { return false; } - if (parent.isWord) { meta.stop = index; } - const found = this.removeHelper(word, child, index + 1, meta); - // deletes all the nodes beyond `meta.stop`. - if (found && index >= meta.stop) { - delete parent.children[word.charAt(index)]; + + let child = stack.pop(); + child.isWord = false; + + // remove non words without children + while (stack.length) { + const parent = stack.pop(); + if (!child.isWord && !Object.keys(child.children).length) { + delete parent.children[child.val]; + } + child = parent; } - return found; + + return true; } /** diff --git a/src/data-structures/trees/trie.spec.js b/src/data-structures/trees/trie.spec.js index fca6588e..84483763 100644 --- a/src/data-structures/trees/trie.spec.js +++ b/src/data-structures/trees/trie.spec.js @@ -137,7 +137,7 @@ describe('Trie', () => { }); }); - describe('remove', () => { + fdescribe('remove', () => { it('should remove a word', () => { trie = new Trie(); trie.insert('a'); diff --git a/src/index.js b/src/index.js index d575aaf0..2c29579d 100644 --- a/src/index.js +++ b/src/index.js @@ -14,6 +14,8 @@ const BinaryTreeNode = require('./data-structures/trees/binary-tree-node'); const AvlTree = require('./data-structures/trees/avl-tree'); const RedBlackTree = require('./data-structures/trees/red-black-tree'); const LRUCache = require('./data-structures/custom/lru-cache'); +const Trie = require('./data-structures/trees/trie'); + // algorithms const bubbleSort = require('./algorithms/sorting/bubble-sort'); const insertionSort = require('./algorithms/sorting/insertion-sort'); @@ -37,6 +39,7 @@ module.exports = { AvlTree, RedBlackTree, LRUCache, + Trie, bubbleSort, insertionSort, selectionSort, From 715cd951fed8c1bdca5ae3c96bd9c26832388032 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 28 Mar 2020 20:17:54 -0400 Subject: [PATCH 052/200] build: add cz-changelog commitizen init cz-conventional-changelog --save-dev --save-exact --- package-lock.json | 1138 +++++++++++++++++++++++++++++++++++++++------ package.json | 10 +- 2 files changed, 1015 insertions(+), 133 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e776f5c..75c3678d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.7", + "version": "1.3.10", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -32,6 +32,60 @@ } } }, + "@commitlint/execute-rule": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz", + "integrity": "sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ==", + "dev": true, + "optional": true + }, + "@commitlint/load": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-8.3.5.tgz", + "integrity": "sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw==", + "dev": true, + "optional": true, + "requires": { + "@commitlint/execute-rule": "^8.3.4", + "@commitlint/resolve-extends": "^8.3.5", + "babel-runtime": "^6.23.0", + "chalk": "2.4.2", + "cosmiconfig": "^5.2.0", + "lodash": "4.17.15", + "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==", + "dev": true, + "optional": true + } + } + }, + "@commitlint/resolve-extends": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz", + "integrity": "sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ==", + "dev": true, + "optional": true, + "requires": { + "import-fresh": "^3.0.0", + "lodash": "4.17.15", + "resolve-from": "^5.0.0", + "resolve-global": "^1.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==", + "dev": true, + "optional": true + } + } + }, "abab": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", @@ -1016,6 +1070,31 @@ } } }, + "cachedir": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", + "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "optional": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "optional": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1209,6 +1288,143 @@ "dev": true, "optional": true }, + "commitizen": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", + "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", + "dev": true, + "requires": { + "cachedir": "2.2.0", + "cz-conventional-changelog": "3.0.1", + "dedent": "0.7.0", + "detect-indent": "6.0.0", + "find-node-modules": "2.0.0", + "find-root": "1.1.0", + "fs-extra": "8.1.0", + "glob": "7.1.4", + "inquirer": "6.5.0", + "is-utf8": "^0.2.1", + "lodash": "4.17.15", + "minimist": "1.2.0", + "shelljs": "0.7.6", + "strip-bom": "4.0.0", + "strip-json-comments": "3.0.1" + }, + "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==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "conventional-commit-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", + "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", + "dev": true + }, + "cz-conventional-changelog": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", + "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "conventional-commit-types": "^2.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" + } + }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "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" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1245,6 +1461,12 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -1272,6 +1494,60 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "optional": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "optional": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "optional": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "optional": true + } + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -1298,6 +1574,22 @@ "cssom": "0.3.x" } }, + "cz-conventional-changelog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", + "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1352,6 +1644,12 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1446,6 +1744,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1881,6 +2185,15 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "expect": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", @@ -1903,142 +2216,486 @@ "requires": { "color-convert": "^1.9.0" } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "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==", + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", + "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", + "dev": true, + "requires": { + "findup-sync": "^3.0.0", + "merge": "^1.2.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.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=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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=", + "dev": true, + "requires": { + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, - "requires": { - "bser": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -2092,6 +2749,17 @@ "map-cache": "^0.2.2" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2702,6 +3370,40 @@ "is-glob": "^2.0.0" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2874,6 +3576,15 @@ "os-tmpdir": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", @@ -2915,6 +3626,26 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "optional": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "optional": true + } + } + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -2947,6 +3678,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -2969,6 +3706,12 @@ "through": "^2.3.6" } }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -3054,6 +3797,13 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "optional": true + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -3792,6 +4542,13 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "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==", + "dev": true, + "optional": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3822,6 +4579,15 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -3908,12 +4674,24 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4538,6 +5316,25 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "optional": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "optional": true + } + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -4559,6 +5356,12 @@ "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -4841,6 +5644,15 @@ "util.promisify": "^1.0.0" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5013,12 +5825,32 @@ } } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "optional": true, + "requires": { + "global-dirs": "^0.1.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -5041,6 +5873,12 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "right-pad": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", + "dev": true + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -5080,6 +5918,15 @@ "rx-lite": "*" } }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5481,6 +6328,17 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shelljs": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz", + "integrity": "sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -6083,6 +6941,12 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6136,6 +7000,12 @@ "set-value": "^2.0.1" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6329,6 +7199,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 2297df68..84891a6c 100644 --- a/package.json +++ b/package.json @@ -31,18 +31,24 @@ "dependencies": {}, "devDependencies": { "benchmark": "2.1.4", + "braces": ">=2.3.1", + "cz-conventional-changelog": "^3.1.0", "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", - "jest": "23.6.0", - "braces": ">=2.3.1", "handlebars": ">=4.0.14", + "jest": "23.6.0", "js-yaml": ">=3.13.1", "mem": ">=4.0.0", "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { "node": ">=10.0.0" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } } } From e8c01e45abac824475665061d9d4a82c594cda6e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 28 Mar 2020 20:25:47 -0400 Subject: [PATCH 053/200] build(build): install husky and commitizen --- package-lock.json | 274 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 8 ++ 2 files changed, 274 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75c3678d..6fd8e60b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,23 @@ } } }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + } + } + }, "@commitlint/execute-rule": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz", @@ -86,6 +103,18 @@ } } }, + "@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==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "abab": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", @@ -1425,6 +1454,12 @@ } } }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -2368,6 +2403,15 @@ "locate-path": "^2.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "findup-sync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", @@ -3611,6 +3655,177 @@ "sshpk": "^1.7.0" } }, + "husky": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3631,7 +3846,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3641,8 +3855,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "optional": true + "dev": true } } }, @@ -4546,8 +4759,7 @@ "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==", - "dev": true, - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", @@ -4646,6 +4858,12 @@ "type-check": "~0.3.2" } }, + "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=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5200,6 +5418,12 @@ } } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -5321,7 +5545,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "optional": true, "requires": { "callsites": "^3.0.0" }, @@ -5330,8 +5553,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "optional": true + "dev": true } } }, @@ -5455,6 +5677,15 @@ "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", "dev": true }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -6284,6 +6515,18 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7199,6 +7442,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7311,6 +7560,15 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.7" + } + }, "yargs": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", diff --git a/package.json b/package.json index 84891a6c..e9ca1d38 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,14 @@ "devDependencies": { "benchmark": "2.1.4", "braces": ">=2.3.1", + "commitizen": "^4.0.3", "cz-conventional-changelog": "^3.1.0", "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jest": "21.17.0", "handlebars": ">=4.0.14", + "husky": "^4.2.3", "jest": "23.6.0", "js-yaml": ">=3.13.1", "mem": ">=4.0.0", @@ -50,5 +52,11 @@ "commitizen": { "path": "./node_modules/cz-conventional-changelog" } + }, + "husky": { + "hooks": { + "pre-commit": "npm run lint", + "pre-push": "npm test" + } } } From efd4e29d661622ba445a5efc5927abacf76c0672 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 28 Mar 2020 20:53:05 -0400 Subject: [PATCH 054/200] :wrench: chore (build) Automate git commit messages --- package-lock.json | 712 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 43 ++- 2 files changed, 754 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 6fd8e60b..daff1586 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1247,6 +1247,16 @@ "restore-cursor": "^2.0.0" } }, + "cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "dev": true, + "requires": { + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -1264,6 +1274,12 @@ "wrap-ansi": "^2.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1625,6 +1641,35 @@ "word-wrap": "^1.0.3" } }, + "cz-emoji": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cz-emoji/-/cz-emoji-1.2.1.tgz", + "integrity": "sha512-3OZvxnYJRraxUslFO2RN0ECO7YeWvgOTcZJcQoIZhmMzZMUgFs5TJXOI+iSFU/lNPhROivtJkf9dcXXMgy9HQA==", + "dev": true, + "requires": { + "cli-truncate": "^1.0.0", + "fuse.js": "^3.4.5", + "home-dir": "^1.0.0", + "inquirer-autocomplete-prompt": "^0.12.0", + "inquirer-maxlength-input-prompt": "^1.0.0", + "pad": "^2.3.0", + "prettier": "^1.18.2", + "read-pkg-up": "^2.0.0", + "wrap-ansi": "^3.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1711,6 +1756,15 @@ } } }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3351,6 +3405,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "fuse.js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", + "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", + "dev": true + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -3610,6 +3670,12 @@ } } }, + "home-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", + "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", + "dev": true + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -3919,6 +3985,589 @@ "through": "^2.3.6" } }, + "inquirer-autocomplete-prompt": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", + "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "figures": "^2.0.0", + "inquirer": "3.2.0", + "run-async": "^2.3.0" + }, + "dependencies": { + "inquirer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", + "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", + "dev": true, + "requires": { + "ansi-escapes": "^2.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + } + } + } + } + }, + "inquirer-maxlength-input-prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", + "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "inquirer": "^5.1.0", + "jest": "^22.4.2", + "lodash.invoke": "^4.5.2", + "lodash.isfunction": "^3.0.9", + "lodash.partialright": "^4.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -4773,6 +5422,15 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -4800,6 +5458,12 @@ "graceful-fs": "^4.1.6" } }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4892,12 +5556,30 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.invoke": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.invoke/-/lodash.invoke-4.5.2.tgz", + "integrity": "sha1-AcoH5HCQOv+j/+x60u0icj0vaXw=", + "dev": true + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", "dev": true }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -5540,6 +6222,15 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pad": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", + "integrity": "sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5716,6 +6407,12 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, "pretty-format": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", @@ -6973,6 +7670,12 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -7395,6 +8098,15 @@ } } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", diff --git a/package.json b/package.json index e9ca1d38..190b6e4c 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "braces": ">=2.3.1", "commitizen": "^4.0.3", "cz-conventional-changelog": "^3.1.0", + "cz-emoji": "^1.2.1", "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", @@ -50,7 +51,47 @@ }, "config": { "commitizen": { - "path": "./node_modules/cz-conventional-changelog" + "path": "cz-emoji" + }, + "cz-emoji": { + "types": [ + { + "emoji": "🐛", + "code": ":bug: fix", + "description": "Fixing a bug on code.", + "name": "fix code" + }, + { + "emoji": "📝", + "code": ":pencil: fix", + "description": "Fixing typos on book.", + "name": "fix typo" + }, + { + "emoji": "✨", + "code": ":sparkles: feat", + "description": "Introducing new features on code and/or book.", + "name": "feature" + }, + { + "emoji": "💥", + "code": ":boom: break", + "description": "Introducing breaking changes.", + "name": "breaking" + }, + { + "emoji": "🔖", + "code": ":bookmark: release", + "description": "Releasing / Version tags.", + "name": "release" + }, + { + "emoji": "🔩", + "code": ":wrench: chore", + "description": "Adding CI/build tools.", + "name": "chore" + } + ] } }, "husky": { From 7da7a46a517fc5e4bcfc141be49e6cd189463597 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 28 Mar 2020 21:10:00 -0400 Subject: [PATCH 055/200] :wrench: chore (build) semantic release --- .circleci/config.yml | 12 ++++++++++++ package.json | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a50b5c40..9ac073a2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -110,9 +110,21 @@ jobs: # a collection of steps path: book/dist destination: book + release: + docker: + - image: 'circleci/node:latest' + steps: + - checkout + - run: + name: install + command: npm install + - run: + name: release + command: npm run semantic-release || true workflows: version: 2 build_and_docs: jobs: - build - docs + - release diff --git a/package.json b/package.json index 190b6e4c..2699661a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.10", + "version": "0.0.0-development", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -17,7 +17,8 @@ "watch": "jest src/ --watch --coverage", "coverage": "jest src/ --coverage && open coverage/lcov-report/index.html", "lint": "npx eslint --fix --format codeframe src/", - "ci": "npx eslint src/ && jest src/ --coverage" + "ci": "npx eslint src/ && jest src/ --coverage", + "semantic-release": "semantic-release" }, "keywords": [ "algorithms", @@ -44,7 +45,8 @@ "jest": "23.6.0", "js-yaml": ">=3.13.1", "mem": ">=4.0.0", - "textlint-plugin-asciidoctor": "1.0.2" + "textlint-plugin-asciidoctor": "1.0.2", + "semantic-release": "^17.0.4" }, "engines": { "node": ">=10.0.0" From 03a420d2d85fb7cdf3da2c2dc58f25e658b89f59 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 28 Mar 2020 21:17:20 -0400 Subject: [PATCH 056/200] :wrench: chore (build): --- .node-version | 2 +- package-lock.json | 17667 ++++++++++++++++++++++++++++++-------------- package.json | 9 +- 3 files changed, 12142 insertions(+), 5536 deletions(-) diff --git a/.node-version b/.node-version index c4d592e1..66df3b7a 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -10.12.0 +12.16.1 diff --git a/package-lock.json b/package-lock.json index daff1586..d6a85bcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.10", + "version": "1.3.9", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -103,622 +103,856 @@ } } }, - "@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==", - "dev": true + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, - "abab": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", - "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", - "dev": true + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "@octokit/auth-token": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", + "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0" + } }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "@octokit/core": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.4.3.tgz", + "integrity": "sha512-9T91nYeBB7+PNK3oxOuA+6DXCPRvhJ80ke+NqhXirBjVtNepTKFJXoWPqguRSBQ+dkEVA8dZJMxfFzjz9yhiuA==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.3.1", + "@octokit/types": "^2.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.0.tgz", + "integrity": "sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^5.0.0" }, "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "dev": true } } }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "@octokit/graphql": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", + "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", "dev": true, "requires": { - "acorn": "^3.0.4" + "@octokit/request": "^5.3.0", + "@octokit/types": "^2.0.0", + "universal-user-agent": "^4.0.0" }, "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true + "universal-user-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", + "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } } } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "@octokit/plugin-paginate-rest": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz", + "integrity": "sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", + "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", "dev": true }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "@octokit/plugin-rest-endpoint-methods": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.4.0.tgz", + "integrity": "sha512-Tvctk0u5SVrSLAzi8SLo0KrLSBl5biAHBgWy3L65vsbO/2fjzr62HVkoDPyr+WRT+eHhhqpKAERF3dQWOIUOvQ==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "@octokit/types": "^2.0.1", + "deprecation": "^2.3.1" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true + "@octokit/request": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.4.tgz", + "integrity": "sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.0", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true + } + } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "@octokit/request-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", + "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "@octokit/rest": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.1.4.tgz", + "integrity": "sha512-LGghhepxoXyvi7ew0OdedrlwXQog8gvTbcdXoQ6RDKnzoYW2rBpcqeWC4fTuPUp9K0UEykcMix8kFnQ5b+64JQ==", + "dev": true, + "requires": { + "@octokit/core": "^2.4.3", + "@octokit/plugin-paginate-rest": "^2.0.0", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "3.4.0" + } }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "@octokit/types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.1.tgz", + "integrity": "sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@semantic-release/commit-analyzer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", + "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.7", + "debug": "^4.0.0", + "import-from": "^3.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" }, "dependencies": { - "arr-diff": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + } + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/github": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", + "integrity": "sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A==", + "dev": true, + "requires": { + "@octokit/rest": "^17.0.0", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "bottleneck": "^2.18.1", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^9.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^2.4.3", + "p-filter": "^2.0.0", + "p-retry": "^4.0.0", + "url-join": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + } + }, + "@semantic-release/npm": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz", + "integrity": "sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "execa": "^4.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^5.0.0", + "npm": "^6.10.3", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^4.0.0", + "semver": "^7.1.2", + "tempy": "^0.5.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, + "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" + } + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "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==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "path-key": "^3.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "ms": "2.0.0" + "mimic-fn": "^2.1.0" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "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==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "shebang-regex": "^3.0.0" } }, - "is-accessor-descriptor": { + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "universalify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "isexe": "^2.0.0" } - }, - "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==", + } + } + }, + "@semantic-release/release-notes-generator": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz", + "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^5.0.0", + "import-from": "^3.0.0", + "into-stream": "^5.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ms": "^2.1.1" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "pump": "^3.0.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "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" + "p-locate": "^4.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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=", + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "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": { + "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==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "@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==", + "dev": true }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } + "@types/node": { + "version": "13.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", + "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", + "dev": true }, - "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==", + "@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==", "dev": true }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "abab": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", + "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "asciidoctor.js": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", - "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { - "opal-runtime": "1.0.11" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "assign-symbols": { + "add-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", "dev": true }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { - "lodash": "^4.17.14" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } } }, - "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==", + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "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=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -728,231 +962,155 @@ "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", - "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.2.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-jest-hoist": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-preset-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", - "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^23.2.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "is-accessor-descriptor": { @@ -984,6 +1142,26 @@ "kind-of": "^6.0.2" } }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -995,1706 +1173,1734 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "default-require-extensions": "^1.0.0" } }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "sprintf-js": "~1.0.2" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.0.1" } }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "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==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true }, - "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==", + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, - "cachedir": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", - "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asciidoctor.js": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", + "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", "dev": true, - "optional": true, "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "optional": true - } + "opal-runtime": "1.0.11" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "callsites": "^0.2.0" + "safer-buffer": "~2.1.0" } }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "dev": true, - "requires": { - "rsvp": "^3.3.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "lodash": "^4.17.14" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "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==", "dev": true }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, - "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==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "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=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^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=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "is-descriptor": "^0.1.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" } }, - "isobject": { + "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "babel-runtime": "^6.22.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, - "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==", + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "color-name": "1.1.3" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "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==", + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, - "optional": true - }, - "commitizen": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", - "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "cachedir": "2.2.0", - "cz-conventional-changelog": "3.0.1", - "dedent": "0.7.0", - "detect-indent": "6.0.0", - "find-node-modules": "2.0.0", - "find-root": "1.1.0", - "fs-extra": "8.1.0", - "glob": "7.1.4", - "inquirer": "6.5.0", - "is-utf8": "^0.2.1", - "lodash": "4.17.15", - "minimist": "1.2.0", - "shelljs": "0.7.6", - "strip-bom": "4.0.0", - "strip-json-comments": "3.0.1" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "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==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "conventional-commit-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", - "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", - "dev": true - }, - "cz-conventional-changelog": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", - "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "conventional-commit-types": "^2.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "right-pad": "^1.0.1", - "word-wrap": "^1.0.3" + "ms": "2.0.0" } }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "is-descriptor": "^1.0.0" } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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==", "dev": true, "requires": { - "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" + "kind-of": "^6.0.0" } }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "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==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "kind-of": "^6.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "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==", - "dev": true + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "dev": true }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", "dev": true }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } }, - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "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==", "dev": true }, - "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=", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cachedir": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", + "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", "dev": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "optional": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "callsites": "^2.0.0" }, "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "optional": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "import-fresh": { + "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "optional": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "optional": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true, "optional": true } } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "callsites": "^0.2.0" } }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "cssom": "0.3.x" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, - "cz-conventional-changelog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", - "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", "dev": true, "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "right-pad": "^1.0.1", - "word-wrap": "^1.0.3" + "rsvp": "^3.3.3" } }, - "cz-emoji": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cz-emoji/-/cz-emoji-1.2.1.tgz", - "integrity": "sha512-3OZvxnYJRraxUslFO2RN0ECO7YeWvgOTcZJcQoIZhmMzZMUgFs5TJXOI+iSFU/lNPhROivtJkf9dcXXMgy9HQA==", + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", "dev": true, "requires": { - "cli-truncate": "^1.0.0", - "fuse.js": "^3.4.5", - "home-dir": "^1.0.0", - "inquirer-autocomplete-prompt": "^0.12.0", - "inquirer-maxlength-input-prompt": "^1.0.0", - "pad": "^2.3.0", - "prettier": "^1.18.2", - "read-pkg-up": "^2.0.0", - "wrap-ansi": "^3.0.0" + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "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==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "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=", + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "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==", "dev": true, "requires": { - "strip-bom": "^2.0.0" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-descriptor": "^0.1.0" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "clone": "^1.0.2" + "restore-cursor": "^2.0.0" } }, - "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==", + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dev": true, "requires": { - "object-keys": "^1.0.12" + "colors": "1.0.3" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dev": true, "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "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=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "repeating": "^2.0.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "esutils": "^2.0.2" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "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==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "color-name": "1.1.3" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "delayed-stream": "~1.0.0" } }, - "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==", + "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==", + "dev": true, + "optional": true + }, + "commitizen": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", + "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", "dev": true, "requires": { - "once": "^1.4.0" + "cachedir": "2.2.0", + "cz-conventional-changelog": "3.0.1", + "dedent": "0.7.0", + "detect-indent": "6.0.0", + "find-node-modules": "2.0.0", + "find-root": "1.1.0", + "fs-extra": "8.1.0", + "glob": "7.1.4", + "inquirer": "6.5.0", + "is-utf8": "^0.2.1", + "lodash": "4.17.15", + "minimist": "1.2.0", + "shelljs": "0.7.6", + "strip-bom": "4.0.0", + "strip-json-comments": "3.0.1" + }, + "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==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "conventional-commit-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", + "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", + "dev": true + }, + "cz-conventional-changelog": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", + "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "conventional-commit-types": "^2.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" + } + }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "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" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } } }, - "error-ex": { + "compare-func": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" } }, - "es-abstract": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", - "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "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==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "conventional-changelog": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz", + "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "conventional-changelog-angular": "^5.0.6", + "conventional-changelog-atom": "^2.0.3", + "conventional-changelog-codemirror": "^2.0.3", + "conventional-changelog-conventionalcommits": "^4.2.3", + "conventional-changelog-core": "^4.1.4", + "conventional-changelog-ember": "^2.0.4", + "conventional-changelog-eslint": "^3.0.4", + "conventional-changelog-express": "^2.0.1", + "conventional-changelog-jquery": "^3.0.6", + "conventional-changelog-jshint": "^2.0.3", + "conventional-changelog-preset-loader": "^2.3.0" } }, - "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=", - "dev": true + "conventional-changelog-angular": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", + "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "conventional-changelog-atom": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", + "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } + "q": "^1.5.1" } }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "conventional-changelog-cli": { + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz", + "integrity": "sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "add-stream": "^1.0.0", + "conventional-changelog": "^3.1.18", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "tempfile": "^3.0.0" } }, - "eslint-config-airbnb-base": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", - "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", + "conventional-changelog-codemirror": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", + "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.5", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "q": "^1.5.1" } }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "conventional-changelog-conventionalcommits": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", + "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz", + "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.11", + "conventional-commits-parser": "^3.0.8", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^3.0.1", + "lodash": "^4.17.15", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "ms": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "ms": "2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "ms": "2.0.0" + "pify": "^3.0.0" } }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } } } }, - "eslint-plugin-jest": { - "version": "21.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.17.0.tgz", - "integrity": "sha512-kB0gaMLy4RA1bAltYSnnoW33hzX0bUrALGaIqaLoB41Fif38/uAv6oNUFbrzp7aFrwegxKUgFcE/8Z0DZEa0SQ==", - "dev": true - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "conventional-changelog-ember": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", + "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "q": "^1.5.1" } }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "conventional-changelog-eslint": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", + "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "q": "^1.5.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "conventional-changelog-express": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", + "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "q": "^1.5.1" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "conventional-changelog-jquery": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", + "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "q": "^1.5.1" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { + "conventional-changelog-jshint": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", + "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", "dev": true, "requires": { - "merge": "^1.2.0" + "compare-func": "^1.3.1", + "q": "^1.5.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "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" + "conventional-changelog-preset-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", + "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", + "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.2", + "dateformat": "^3.0.0", + "handlebars": "^4.4.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^3.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "conventional-commits-filter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", + "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "conventional-commits-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", + "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", "dev": true, "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "safe-buffer": "~5.1.1" } }, - "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "optional": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "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==", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, + "optional": true, "requires": { - "is-plain-object": "^2.0.4" + "caller-callsite": "^2.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "optional": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "optional": true } } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { + "crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { - "bser": "^2.0.0" + "cssom": "0.3.x" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "array-find-index": "^1.0.1" } }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "cz-conventional-changelog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", + "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "cz-emoji": { + "version": "github:amejiarosario/cz-emoji#c7518f2b6ed3368dd60a37c1a4abbfff041549c0", + "from": "github:amejiarosario/cz-emoji", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "cli-truncate": "^1.0.0", + "fuse.js": "^3.4.5", + "home-dir": "^1.0.0", + "inquirer-autocomplete-prompt": "^0.12.0", + "inquirer-maxlength-input-prompt": "^1.0.0", + "pad": "^2.3.0", + "prettier": "^1.18.2", + "read-pkg-up": "^2.0.0", + "wrap-ansi": "^3.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } } }, - "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==", + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "number-is-nan": "^1.0.0" } }, - "find-node-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", - "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "findup-sync": "^3.0.0", - "merge": "^1.2.1" + "assert-plus": "^1.0.0" } }, - "find-root": { + "data-urls": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } } }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "ms": "^2.1.1" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + } + } + }, + "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=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "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==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-utf8": "^0.2.0" } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "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==", "dev": true, "requires": { - "ms": "2.0.0" + "kind-of": "^6.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=", + "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==", "dev": true, "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2708,41 +2914,6 @@ "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=", - "dev": true - }, - "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==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -2750,3773 +2921,10150 @@ "dev": true }, "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } } } }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "for-in": "^1.0.1" + "repeating": "^2.0.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, - "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==", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "esutils": "^2.0.2" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "webidl-conversions": "^4.0.2" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, - "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-ci": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", + "integrity": "sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "java-properties": "^1.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, - "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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" } }, - "chownr": { - "version": "1.1.1", - "bundled": true, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, - "optional": true + "requires": { + "pump": "^3.0.0" + } }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, + "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==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "bundled": true, + "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==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "minimatch": "^3.0.4" + "path-key": "^3.0.0" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "mimic-fn": "^2.1.0" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "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==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "shebang-regex": "^3.0.0" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "minimist": "0.0.8" + "isexe": "^2.0.0" } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=", + "dev": true + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + } + }, + "eslint-config-airbnb-base": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", + "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.5", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "ms": "2.0.0" } }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "ms": "2.0.0" } }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ms": "2.0.0" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "eslint-plugin-jest": { + "version": "21.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.17.0.tgz", + "integrity": "sha512-kB0gaMLy4RA1bAltYSnnoW33hzX0bUrALGaIqaLoB41Fif38/uAv6oNUFbrzp7aFrwegxKUgFcE/8Z0DZEa0SQ==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { - "pump": "^3.0.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "dev": true, - "requires": { - "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" - } + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "estraverse": "^4.0.0" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "is-glob": "^2.0.0" + "estraverse": "^4.1.0" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "optional": true, - "requires": { - "ini": "^1.3.4" - } + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "merge": "^1.2.0" } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "handlebars": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", - "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "is-posix-bracket": "^0.1.0" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "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==", + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "fill-range": "^2.1.0" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "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==", - "dev": true + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } } } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "function-bind": "^1.1.1" + "homedir-polyfill": "^1.0.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } } } }, - "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=", + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "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" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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==", "dev": true, "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-glob": "^4.0.1" } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-extglob": "^2.1.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } } } }, - "home-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", - "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "home-or-tmp": { + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "bser": "^2.0.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "escape-string-regexp": "^1.0.5" } }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "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==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "to-regex-range": "^5.0.1" } }, - "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "find-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", + "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", "dev": true, "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "findup-sync": "^3.0.0", + "merge": "^1.2.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "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==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "color-name": "~1.1.4" + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "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==", - "dev": true + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "has-flag": { + "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "kind-of": "^6.0.0" } }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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==", "dev": true, "requires": { - "p-try": "^2.0.0" + "kind-of": "^6.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==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "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==", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "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==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "is-extglob": "^2.1.1" } }, - "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==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "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==", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "find-up": "^4.0.0" + "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" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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=", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" } }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "for-in": "^1.0.1" } }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "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==", "dev": true, "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "map-cache": "^0.2.2" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "inquirer-autocomplete-prompt": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", - "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "figures": "^2.0.0", - "inquirer": "3.2.0", - "run-async": "^2.3.0" - }, - "dependencies": { - "inquirer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", - "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", - "dev": true, - "requires": { - "ansi-escapes": "^2.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - } - } - } + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "inquirer-maxlength-input-prompt": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", - "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, + "optional": true, "requires": { - "chalk": "^2.3.1", - "inquirer": "^5.1.0", - "jest": "^22.4.2", - "lodash.invoke": "^4.5.2", - "lodash.isfunction": "^3.0.9", - "lodash.partialright": "^4.2.1" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true }, - "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==", + "ansi-regex": { + "version": "2.1.1", + "bundled": true, "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "optional": true }, - "babel-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", - "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "aproba": { + "version": "1.2.0", + "bundled": true, "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.4" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", - "dev": true + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true }, - "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "dev": true, + "optional": true, "requires": { - "babel-plugin-jest-hoist": "^22.4.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "code-point-at": { + "version": "1.1.0", + "bundled": true, "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - } + "optional": true }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" + "ms": "^2.1.1" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "minipass": "^2.2.1" } }, - "invert-kv": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "bundled": true, + "dev": true, + "optional": true }, - "jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", - "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "gauge": { + "version": "2.7.4", + "bundled": true, "dev": true, + "optional": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^22.4.4" - }, - "dependencies": { - "jest-cli": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", - "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.14", - "istanbul-lib-coverage": "^1.1.1", - "istanbul-lib-instrument": "^1.8.0", - "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.2.0", - "jest-config": "^22.4.4", - "jest-environment-jsdom": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^22.4.2", - "jest-message-util": "^22.4.0", - "jest-regex-util": "^22.1.0", - "jest-resolve-dependencies": "^22.1.0", - "jest-runner": "^22.4.4", - "jest-runtime": "^22.4.4", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "jest-worker": "^22.2.2", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^10.0.3" - } - } + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, - "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "glob": { + "version": "7.1.3", + "bundled": true, "dev": true, + "optional": true, "requires": { - "throat": "^4.0.0" + "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" } }, - "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "has-unicode": { + "version": "2.0.1", + "bundled": true, "dev": true, - "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" - } + "optional": true }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "iconv-lite": { + "version": "0.4.24", + "bundled": true, "dev": true, + "optional": true, "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "safer-buffer": ">= 2.1.2 < 3" } }, - "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "ignore-walk": { + "version": "3.0.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "detect-newline": "^2.1.0" + "minimatch": "^3.0.4" } }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "inflight": { + "version": "1.0.6", + "bundled": true, "dev": true, + "optional": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", - "jsdom": "^11.5.1" + "once": "^1.3.0", + "wrappy": "1" } }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "inherits": { + "version": "2.0.3", + "bundled": true, "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" - } + "optional": true }, - "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^22.4.3", - "jest-serializer": "^22.4.3", - "jest-worker": "^22.4.3", - "micromatch": "^2.3.11", - "sane": "^2.0.0" + "number-is-nan": "^1.0.0" } }, - "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "isarray": { + "version": "1.0.0", + "bundled": true, "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", - "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" + "brace-expansion": "^1.1.7" } }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, "dev": true, + "optional": true, "requires": { - "pretty-format": "^22.4.3" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "minizlib": { + "version": "1.2.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "minipass": "^2.2.1" } }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "mkdirp": { + "version": "0.5.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" + "minimist": "0.0.8" } }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true - }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", - "dev": true + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "needle": { + "version": "2.3.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "jest-regex-util": "^22.4.3" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, - "jest-runner": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", - "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "nopt": { + "version": "4.0.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "exit": "^0.1.2", - "jest-config": "^22.4.4", - "jest-docblock": "^22.4.0", - "jest-haste-map": "^22.4.2", - "jest-jasmine2": "^22.4.4", - "jest-leak-detector": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-runtime": "^22.4.4", - "jest-util": "^22.4.1", - "jest-worker": "^22.2.2", - "throat": "^4.0.0" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "jest-runtime": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", - "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^22.4.4", - "babel-plugin-istanbul": "^4.1.5", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^22.4.4", - "jest-haste-map": "^22.4.2", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^10.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, - "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", - "dev": true - }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "npmlog": { + "version": "4.1.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "number-is-nan": { + "version": "1.0.1", + "bundled": true, "dev": true, - "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0" - } + "optional": true }, - "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "object-assign": { + "version": "4.1.1", + "bundled": true, "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-config": "^22.4.4", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^22.4.0" - } + "optional": true }, - "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "once": { + "version": "1.4.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "merge-stream": "^1.0.1" + "wrappy": "1" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, "dev": true, + "optional": true, "requires": { - "invert-kv": "^1.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, "dev": true, + "optional": true, "requires": { - "mimic-fn": "^1.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "readable-stream": { + "version": "2.3.6", + "bundled": true, "dev": true, + "optional": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "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" } }, - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "rimraf": { + "version": "2.6.3", + "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "glob": "^7.1.3" } }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "symbol-observable": "1.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "string_decoder": { + "version": "1.1.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "safe-buffer": "~5.1.0" } }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "strip-ansi": { + "version": "3.0.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "ansi-regex": "^2.0.0" } }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, "dev": true, + "optional": true, "requires": { - "camelcase": "^4.1.0" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "fuse.js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", + "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", "dev": true }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", "dev": true, "requires": { - "ci-info": "^1.5.0" + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } } }, - "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=", + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "pump": "^3.0.0" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "assert-plus": "^1.0.0" + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" }, "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==", - "dev": true + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", "dev": true, - "optional": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "git-semver-tags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz", + "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==", + "dev": true, + "requires": { + "meow": "^5.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "is-extglob": { + "gitconfiglocal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "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" } }, - "is-fullwidth-code-point": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { "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=", - "dev": true + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } }, - "is-generator-fn": { + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "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==", + "globby": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", "dev": true, "requires": { - "isobject": "^3.0.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "handlebars": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", + "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", "dev": true, "requires": { - "has": "^1.0.1" + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "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==", "dev": true, "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "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==", + "dev": true + } + } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } }, - "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==", - "dev": true + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "isarray": { + "has-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "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=", "dev": true, "requires": { - "isarray": "1.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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "home-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", + "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", "dev": true }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "append-transform": "^0.4.0" + "parse-passwd": "^1.0.0" } }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" + "whatwg-encoding": "^1.0.1" } }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "ms": "^2.1.1" } } } }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", - "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.6.0" + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" }, "dependencies": { - "jest-cli": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", - "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "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==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.4.2", - "jest-config": "^23.6.0", - "jest-environment-jsdom": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve-dependencies": "^23.6.0", - "jest-runner": "^23.6.0", - "jest-runtime": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "jest-watcher": "^23.4.0", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "prompts": "^0.1.9", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "jest-changed-files": { - "version": "23.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", - "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "throat": "^4.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "jest-config": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", - "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.6.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^23.4.0", - "jest-environment-node": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.6.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "pretty-format": "^23.6.0" - } - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-docblock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", - "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", - "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "pretty-format": "^23.6.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, - "jest-environment-jsdom": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", - "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0", - "jsdom": "^11.5.1" + "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==", + "dev": true + } } }, - "jest-environment-node": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", - "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "jest-haste-map": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", - "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", - "dev": true, - "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "invariant": "^2.2.4", - "jest-docblock": "^23.2.0", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0" - } - }, - "jest-jasmine2": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", - "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", - "dev": true, - "requires": { - "babel-traverse": "^6.0.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^23.6.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.6.0", - "jest-each": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "pretty-format": "^23.6.0" - } - }, - "jest-leak-detector": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", - "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", - "dev": true, - "requires": { - "pretty-format": "^23.6.0" - } - }, - "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, - "jest-message-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", - "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" + "once": "^1.3.0", + "wrappy": "1" } }, - "jest-mock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "jest-regex-util": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "jest-resolve": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", - "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "realpath-native": "^1.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", - "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.6.0" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, - "jest-runner": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", - "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "inquirer-autocomplete-prompt": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", + "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", "dev": true, "requires": { - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.6.0", - "jest-jasmine2": "^23.6.0", - "jest-leak-detector": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-runtime": "^23.6.0", - "jest-util": "^23.4.0", - "jest-worker": "^23.2.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "figures": "^2.0.0", + "inquirer": "3.2.0", + "run-async": "^2.3.0" }, "dependencies": { - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "inquirer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", + "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "jest-runtime": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", - "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" - } - }, - "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", - "dev": true - }, - "jest-snapshot": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", - "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", - "dev": true, - "requires": { - "babel-types": "^6.0.0", - "chalk": "^2.0.1", - "jest-diff": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-resolve": "^23.6.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^23.6.0", - "semver": "^5.5.0" + "ansi-escapes": "^2.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + } + } + } } }, - "jest-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", - "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "inquirer-maxlength-input-prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", + "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", "dev": true, "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.4.0", - "mkdirp": "^0.5.1", - "slash": "^1.0.0", - "source-map": "^0.6.0" + "chalk": "^2.3.1", + "inquirer": "^5.1.0", + "jest": "^22.4.2", + "lodash.invoke": "^4.5.2", + "lodash.isfunction": "^3.0.9", + "lodash.partialright": "^4.2.1" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true - } - } - }, - "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-watcher": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", - "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", - "dev": true, - "requires": { - "merge-stream": "^1.0.1" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "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==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "into-stream": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", + "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "dependencies": { + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "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==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "optional": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.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=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "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=", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "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==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "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==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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=", "dev": true }, - "json5": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.invoke": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.invoke/-/lodash.invoke-4.5.2.tgz", + "integrity": "sha1-AcoH5HCQOv+j/+x60u0icj0vaXw=", + "dev": true + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "marked-terminal": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.0.0.tgz", + "integrity": "sha512-mzU3VD7aVz12FfGoKFAceijehA6Ocjfg3rVimvJbFAB/NOYCsuzRVtq3PSFdPmWI5mhdGeEh3/aMJ5DSxAz94Q==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cardinal": "^2.1.1", + "chalk": "^3.0.0", + "cli-table": "^0.3.1", + "node-emoji": "^1.10.0", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mem": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + } + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "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==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.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==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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.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=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true + "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==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "remove-trailing-separator": "^1.0.1" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "normalize-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.0.0.tgz", + "integrity": "sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw==", + "dev": true + }, + "npm": { + "version": "6.14.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz", + "integrity": "sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.7", + "bluebird": "^3.5.5", + "byte-size": "^5.0.1", + "cacache": "^12.0.3", + "call-limit": "^1.1.1", + "chownr": "^1.1.4", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "^3.0.3", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.3.0", + "glob": "^7.1.6", + "graceful-fs": "^4.2.3", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.8.8", + "iferr": "^1.0.2", + "imurmurhash": "*", + "infer-owner": "^1.0.4", + "inflight": "~1.0.6", + "inherits": "^2.0.4", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^4.0.7", + "libnpm": "^3.0.1", + "libnpmaccess": "^3.0.2", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "libnpx": "^10.2.2", + "lock-verify": "^2.1.0", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^5.1.1", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.4", + "move-concurrently": "^1.0.1", + "node-gyp": "^5.1.0", + "nopt": "~4.0.1", + "normalize-package-data": "^2.5.0", + "npm-audit-report": "^1.3.2", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "^3.0.2", + "npm-lifecycle": "^3.1.4", + "npm-package-arg": "^6.1.1", + "npm-packlist": "^1.4.8", + "npm-pick-manifest": "^3.0.2", + "npm-profile": "^4.0.4", + "npm-registry-fetch": "^4.0.3", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.1", + "osenv": "^0.1.5", + "pacote": "^9.5.12", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.8.2", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "^1.0.5", + "read-installed": "~4.0.3", + "read-package-json": "^2.1.1", + "read-package-tree": "^5.3.1", + "readable-stream": "^3.6.0", + "readdir-scoped-modules": "^1.1.0", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.7.1", + "safe-buffer": "^5.1.2", + "semver": "^5.7.1", + "sha": "^3.0.0", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.1", + "tar": "^4.4.13", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.3", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.7.0", + "write-file-atomic": "^2.4.3" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "bundled": true, + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cmd-shim": "^3.0.0", + "gentle-fs": "^2.3.0", + "graceful-fs": "^4.1.15", + "npm-normalize-package-bin": "^1.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "bluebird": { + "version": "3.5.5", + "bundled": true, + "dev": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "12.0.3", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "call-limit": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "err-code": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "bundled": true, + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.6.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2", + "chownr": "^1.1.2", + "cmd-shim": "^3.0.3", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "infer-owner": "^1.0.4", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "bundled": true, + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^1.5.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "bundled": true, + "dev": true + } + } + }, + "is-cidr": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^2.0.10" + } + }, + "is-date-object": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "libcipm": { + "version": "4.0.7", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpm": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.2", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmpublish": "^1.1.2", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.2", + "npm-registry-fetch": "^4.0.0", + "npmlog": "^4.1.2", + "pacote": "^9.5.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" + } + }, + "libnpmaccess": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmhook": { + "version": "5.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmorg": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmpublish": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + } + }, + "libnpmsearch": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmteam": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpx": { + "version": "10.2.2", + "bundled": true, + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^6.1.0", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "mkdirp": { + "version": "0.5.4", + "bundled": true, + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "npm-audit-report": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "3.1.4", + "bundled": true, + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "4.0.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true, + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "bundled": true, + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.1", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "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" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.5.12", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, + "query-string": { + "version": "6.8.2", + "bundled": true, + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "bundled": true, + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "dev": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "split-on-first": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "dev": true, + "requires": { + "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", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true, + "dev": true + } + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "through": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.3", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.7.0", + "bundled": true, + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.1.1", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } } }, - "kleur": { + "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "path-key": "^2.0.0" } }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "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=", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash.invoke": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.invoke/-/lodash.invoke-4.5.2.tgz", - "integrity": "sha1-AcoH5HCQOv+j/+x60u0icj0vaXw=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.partialright": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", "dev": true }, - "longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "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==", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, - "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==", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", "dev": true, "requires": { - "tmpl": "1.0.x" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "p-defer": "^1.0.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" + "isobject": "^3.0.1" }, "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - } + "wrappy": "1" } }, - "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==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mime-db": "1.40.0" + "mimic-fn": "^1.0.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==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "opal-runtime": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", + "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "glob": "6.0.4", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "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==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "minimist": "0.0.8" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true } } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", "dev": true }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "p-map": "^2.0.0" } }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "p-try": "^1.0.0" } }, - "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=", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "path-key": "^2.0.0" + "p-limit": "^1.1.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "p-retry": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz", + "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "@types/retry": "^0.12.0", + "retry": "^0.12.0" } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "pad": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", + "integrity": "sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } }, - "object-visit": { + "parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "isobject": "^3.0.0" + "callsites": "^3.0.0" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true } } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "error-ex": "^1.2.0" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "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==", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "pify": "^2.0.0" } }, - "object.omit": { + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "pinkie": "^2.0.0" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { - "isobject": "^3.0.1" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "find-up": "^2.1.0" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "dev": true }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "semver-compare": "^1.0.0" } }, - "opal-runtime": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", - "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "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=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", "dev": true, "requires": { - "glob": "6.0.4", - "xmlhttprequest": "1.8.0" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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==", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "color-convert": "^1.9.0" } } } }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "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==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "p-try": "^1.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, - "p-locate": { + "read-pkg-up": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.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=", - "dev": true + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } }, - "pad": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", - "integrity": "sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw==", + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { - "wcwidth": "^1.0.1" + "util.promisify": "^1.0.0" } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } + "resolve": "^1.1.6" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "esprima": "~4.0.0" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "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=", "dev": true }, - "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=", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, - "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=", + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "path-key": { + "repeating": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } }, - "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==", - "dev": true + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "pify": "^2.0.0" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "path-parse": "^1.0.6" } }, - "pkg-dir": { + "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "find-up": "^2.1.0" + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, + "optional": true, "requires": { - "semver-compare": "^1.0.0" + "global-dirs": "^0.1.1" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } }, - "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=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "right-pad": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", "dev": true }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } + "glob": "^7.1.3" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "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==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true }, - "prompts": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", - "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "kleur": "^2.0.1", - "sisteransi": "^0.1.1" + "is-promise": "^2.1.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "rx-lite": "*" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" }, "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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=", + "dev": true, + "requires": { + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "kind-of": { @@ -6524,688 +13072,512 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "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=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "optional": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-pad": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", - "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "semantic-release": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.4.tgz", + "integrity": "sha512-5y9QRSrZtdvACmlpX5DvEVsvFuKRDUVn7JVJFxPVLGrGofDf1d0M/+hA1wFmCjiJZ+VCY8bYaSqVqF14KCF9rw==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "@semantic-release/commit-analyzer": "^8.0.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^7.0.0", + "@semantic-release/npm": "^7.0.0", + "@semantic-release/release-notes-generator": "^9.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^6.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^4.0.0", + "figures": "^3.0.0", + "find-versions": "^3.0.0", + "get-stream": "^5.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^3.0.0", + "lodash": "^4.17.15", + "marked": "^0.8.0", + "marked-terminal": "^4.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.1.1", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^15.0.1" }, "dependencies": { - "arr-diff": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.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==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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==", + "dev": true, + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, + "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" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "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==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "p-locate": "^4.1.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==", "dev": true, "requires": { - "ms": "2.0.0" + "yallist": "^3.0.2" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "path-key": "^3.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "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": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "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==", + "dev": true } } }, - "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==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } }, - "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==", + "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==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "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==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "shebang-regex": "^3.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "ansi-regex": "^5.0.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "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" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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==", "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "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=", + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -7218,6 +13590,23 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, "semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", @@ -7291,6 +13680,17 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + } + }, "sisteransi": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", @@ -7483,6 +13883,12 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", + "dev": true + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -7515,6 +13921,15 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -7524,6 +13939,27 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7580,6 +14016,16 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", @@ -7658,6 +14104,18 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "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==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7670,6 +14128,33 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -7696,6 +14181,48 @@ "string-width": "^2.1.1" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempfile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", + "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", + "dev": true, + "requires": { + "temp-dir": "^2.0.0", + "uuid": "^3.3.2" + } + }, + "tempy": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz", + "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.12.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true + }, + "type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "dev": true + } + } + }, "test-exclude": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", @@ -7784,6 +14311,12 @@ } } }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7811,6 +14344,15 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -7881,6 +14423,24 @@ "punycode": "^2.1.0" } }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -7917,6 +14477,12 @@ "prelude-ls": "~1.1.2" } }, + "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==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -7946,6 +14512,24 @@ "set-value": "^2.0.1" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -8013,6 +14597,12 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -8160,6 +14750,15 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, + "windows-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -8260,6 +14859,12 @@ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", diff --git a/package.json b/package.json index 2699661a..0511b820 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "0.0.0-development", + "version": "1.3.11", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -34,8 +34,9 @@ "benchmark": "2.1.4", "braces": ">=2.3.1", "commitizen": "^4.0.3", + "conventional-changelog-cli": "^2.0.31", "cz-conventional-changelog": "^3.1.0", - "cz-emoji": "^1.2.1", + "cz-emoji": "amejiarosario/cz-emoji", "eslint": "4.19.1", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.16.0", @@ -45,8 +46,8 @@ "jest": "23.6.0", "js-yaml": ">=3.13.1", "mem": ">=4.0.0", - "textlint-plugin-asciidoctor": "1.0.2", - "semantic-release": "^17.0.4" + "semantic-release": "^17.0.4", + "textlint-plugin-asciidoctor": "1.0.2" }, "engines": { "node": ">=10.0.0" From fd8aa2ec665b8ca5ba976a6691f452c7d36084be Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 29 Mar 2020 20:39:51 -0400 Subject: [PATCH 057/200] :wrench: chore (ci): improve ci --- .circleci/config.yml | 16 ++++------------ package.json | 3 +-- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9ac073a2..f7c264fa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,6 +46,10 @@ jobs: # a collection of steps - store_test_results: # for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/ path: test-results.xml + - run: + name: release + command: npm run semantic-release || true + docs: docker: - image: circleci/ruby:2.5.3-stretch-node @@ -110,21 +114,9 @@ jobs: # a collection of steps path: book/dist destination: book - release: - docker: - - image: 'circleci/node:latest' - steps: - - checkout - - run: - name: install - command: npm install - - run: - name: release - command: npm run semantic-release || true workflows: version: 2 build_and_docs: jobs: - build - docs - - release diff --git a/package.json b/package.json index 0511b820..b9dbe1ad 100644 --- a/package.json +++ b/package.json @@ -99,8 +99,7 @@ }, "husky": { "hooks": { - "pre-commit": "npm run lint", - "pre-push": "npm test" + "pre-push": "npm run ci" } } } From 696fc4268d56f4acb0d3d41ba971160eefe7e271 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 29 Mar 2020 20:43:50 -0400 Subject: [PATCH 058/200] :wrench: chore (docs): simplify contributing --- CONTRIBUTING.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 50b826a3..eeff4b34 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -137,15 +137,9 @@ If the commit reverts a previous commit, it should begin with `revert: `, follow ### Type Must be one of the following: -* **feat**: A new feature * **fix**: A bug fix -* **docs**: Documentation only changes -* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) -* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs) -* **test**: Adding missing tests or correcting existing tests -* **refactor**: A code change that neither fixes a bug nor adds a feature -* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) -* **perf**: A code change that improves performance +* **feat**: A new feature +* **chore**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs) ### Scope The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages. From 9d25b28cfdf529e6564666738d6e4ac501d57c6c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 29 Mar 2020 20:59:32 -0400 Subject: [PATCH 059/200] :wrench: chore (ci): format tags --- package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b9dbe1ad..8a3332ad 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "coverage": "jest src/ --coverage && open coverage/lcov-report/index.html", "lint": "npx eslint --fix --format codeframe src/", "ci": "npx eslint src/ && jest src/ --coverage", - "semantic-release": "semantic-release" + "semantic-release": "semantic-release", + "release:check": "semantic-release --dry-run" }, "keywords": [ "algorithms", @@ -101,5 +102,9 @@ "hooks": { "pre-push": "npm run ci" } + }, + "release": { + "tagFormat": "${version}", + "branch": "master" } } From 43041adb55e4a4b354c9ad3b71fd8b3e69bb1f02 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 29 Mar 2020 21:19:36 -0400 Subject: [PATCH 060/200] :wrench: chore (build): automate changelog creation --- package-lock.json | 184 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 20 +++-- 2 files changed, 196 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6a85bcb..b3d852dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.9", + "version": "1.3.11", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -292,6 +292,48 @@ "@types/node": ">= 8" } }, + "@semantic-release/changelog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-5.0.1.tgz", + "integrity": "sha512-unvqHo5jk4dvAf2nZ3aw4imrlwQ2I50eVVvq9D47Qc3R+keNqepx1vDYwkjF8guFXnOYaYcR28yrZWno1hFbiw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + } + }, "@semantic-release/commit-analyzer": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", @@ -334,6 +376,146 @@ "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", "dev": true }, + "@semantic-release/git": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-9.0.0.tgz", + "integrity": "sha512-AZ4Zha5NAPAciIJH3ipzw/WU9qLAn8ENaoVAhD6srRPxTpTzuV3NhNh14rcAo8Paj9dO+5u4rTKcpetOBluYVw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "@semantic-release/github": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", diff --git a/package.json b/package.json index 8a3332ad..90d7987e 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "license": "MIT", "dependencies": {}, "devDependencies": { + "@semantic-release/changelog": "^5.0.1", + "@semantic-release/git": "^9.0.0", "benchmark": "2.1.4", "braces": ">=2.3.1", "commitizen": "^4.0.3", @@ -83,12 +85,6 @@ "description": "Introducing breaking changes.", "name": "breaking" }, - { - "emoji": "🔖", - "code": ":bookmark: release", - "description": "Releasing / Version tags.", - "name": "release" - }, { "emoji": "🔩", "code": ":wrench: chore", @@ -105,6 +101,16 @@ }, "release": { "tagFormat": "${version}", - "branch": "master" + "branch": "master", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + "@semantic-release/github", + "@semantic-release/npm", + ["@semantic-release/git", { + "message": ":bookmark: chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" + }] + ] } } From bcc81b4415a39b53b5b074157461ac72caf58849 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 30 Mar 2020 18:51:13 +0000 Subject: [PATCH 061/200] :bookmark: chore(release): 1.5.0 # [1.5.0](https://github.com/amejiarosario/dsa.js/compare/1.4.0...1.5.0) (2020-03-30) ### Features * **linkedList:** remove by node ([eac045a](https://github.com/amejiarosario/dsa.js/commit/eac045a6bedd0223a2e8b12225f87c428e6fb66f)) * **lru-cache:** add new implementations ([3e787c6](https://github.com/amejiarosario/dsa.js/commit/3e787c6f9ba9c094272be5ac05b997ce44a359d3)) * **trie:** remove method ([16005f3](https://github.com/amejiarosario/dsa.js/commit/16005f3bf39597759918e34b39d27eb25a5755e7)) --- CHANGELOG.md | 9 +++++++++ package-lock.json | 2 +- package.json | 11 +++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6967729..666f4965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [1.5.0](https://github.com/amejiarosario/dsa.js/compare/1.4.0...1.5.0) (2020-03-30) + + +### Features + +* **linkedList:** remove by node ([eac045a](https://github.com/amejiarosario/dsa.js/commit/eac045a6bedd0223a2e8b12225f87c428e6fb66f)) +* **lru-cache:** add new implementations ([3e787c6](https://github.com/amejiarosario/dsa.js/commit/3e787c6f9ba9c094272be5ac05b997ce44a359d3)) +* **trie:** remove method ([16005f3](https://github.com/amejiarosario/dsa.js/commit/16005f3bf39597759918e34b39d27eb25a5755e7)) + # Changelog All notable changes to this project will be documented in this file. diff --git a/package-lock.json b/package-lock.json index b3d852dd..bb64e661 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.11", + "version": "1.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 90d7987e..53df590f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.3.11", + "version": "1.5.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -108,9 +108,12 @@ "@semantic-release/changelog", "@semantic-release/github", "@semantic-release/npm", - ["@semantic-release/git", { - "message": ":bookmark: chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" - }] + [ + "@semantic-release/git", + { + "message": ":bookmark: chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" + } + ] ] } } From 64a4a4fcfeefbf372221d9c279ce17ab53e857d6 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 6 May 2020 17:20:11 -0400 Subject: [PATCH 062/200] chore(lab): add new exercises * chore(lab): critial routers exercise * solve the problem but with repetitions * :wrench: chore (lab): solve the problem * --wip-- [skip ci] * --wip-- [skip ci] * feat(lab): integer to words * feat(lab): improve algo to cover corner cases * chore(lab): alien dictionary exercise * chore(lab): sum exercises added * new exercise * using dijkstra algorithm * new exercises * update exercises * new exercise * solution * :wrench: chore eslint --- .eslintrc.js | 3 +- lab/exercises/10-mixed/2sum-1.js | 31 + lab/exercises/10-mixed/2sum.js | 25 + lab/exercises/10-mixed/2sum.spec.js | 23 + lab/exercises/10-mixed/3sum-1.js | 29 + lab/exercises/10-mixed/3sum-2.js | 47 + lab/exercises/10-mixed/3sum.js | 47 + lab/exercises/10-mixed/3sum.spec.js | 44 + lab/exercises/10-mixed/alien-dictionary.js | 109 + .../10-mixed/alien-dictionary.spec.js | 60 + .../10-mixed/critical-connections-1.js | 74 + .../10-mixed/critical-connections.data.js | 6 + .../10-mixed/critical-connections.js | 54 + .../10-mixed/critical-connections.runner.js | 17 + .../10-mixed/critical-connections.spec.js | 42 + lab/exercises/10-mixed/critical-routers.js | 77 + .../10-mixed/critical-routers.spec.js | 64 + lab/exercises/10-mixed/even-first.js | 15 + lab/exercises/10-mixed/even-first.spec.js | 20 + lab/exercises/10-mixed/get-temperature-api.js | 29 + .../10-mixed/get-temperature-api.spec.js | 15 + lab/exercises/10-mixed/integer-to-words.js | 48 + .../10-mixed/integer-to-words.spec-assert.js | 27 + .../10-mixed/integer-to-words.spec.js | 9 + .../10-mixed/network-delay-time-0.js | 42 + .../10-mixed/network-delay-time-1.js | 45 + lab/exercises/10-mixed/network-delay-time.js | 45 + .../10-mixed/network-delay-time.spec.js | 31 + lab/exercises/10-mixed/reorder-log-files.js | 24 + .../10-mixed/reorder-log-files.spec.js | 15 + .../10-mixed/rotated-binary-search-1.js | 24 + .../10-mixed/rotated-binary-search.js | 23 + .../10-mixed/rotated-binary-search.spec.js | 72 + .../10-mixed/trapping-rain-water-1.js | 28 + lab/exercises/10-mixed/trapping-rain-water.js | 28 + .../10-mixed/trapping-rain-water.spec.js | 19 + package-lock.json | 16351 ++++++++++------ package.json | 20 +- src/data-structures/graphs/graph.js | 6 +- src/data-structures/graphs/graph.spec.js | 2 +- src/data-structures/graphs/node.spec.js | 12 +- .../linked-lists/linked-list.js | 2 +- src/data-structures/sets/array-set.js | 2 +- src/data-structures/sets/hash-set.js | 2 +- src/data-structures/sets/map-set.js | 2 +- src/data-structures/sets/tree-set.js | 2 +- src/data-structures/trees/avl-tree.spec.js | 2 +- .../trees/binary-search-tree.spec.js | 10 +- src/runtimes/07-sub-sets.js | 2 +- 49 files changed, 11752 insertions(+), 5974 deletions(-) create mode 100644 lab/exercises/10-mixed/2sum-1.js create mode 100644 lab/exercises/10-mixed/2sum.js create mode 100644 lab/exercises/10-mixed/2sum.spec.js create mode 100644 lab/exercises/10-mixed/3sum-1.js create mode 100644 lab/exercises/10-mixed/3sum-2.js create mode 100644 lab/exercises/10-mixed/3sum.js create mode 100644 lab/exercises/10-mixed/3sum.spec.js create mode 100644 lab/exercises/10-mixed/alien-dictionary.js create mode 100644 lab/exercises/10-mixed/alien-dictionary.spec.js create mode 100644 lab/exercises/10-mixed/critical-connections-1.js create mode 100644 lab/exercises/10-mixed/critical-connections.data.js create mode 100644 lab/exercises/10-mixed/critical-connections.js create mode 100644 lab/exercises/10-mixed/critical-connections.runner.js create mode 100644 lab/exercises/10-mixed/critical-connections.spec.js create mode 100644 lab/exercises/10-mixed/critical-routers.js create mode 100644 lab/exercises/10-mixed/critical-routers.spec.js create mode 100644 lab/exercises/10-mixed/even-first.js create mode 100644 lab/exercises/10-mixed/even-first.spec.js create mode 100644 lab/exercises/10-mixed/get-temperature-api.js create mode 100644 lab/exercises/10-mixed/get-temperature-api.spec.js create mode 100644 lab/exercises/10-mixed/integer-to-words.js create mode 100644 lab/exercises/10-mixed/integer-to-words.spec-assert.js create mode 100644 lab/exercises/10-mixed/integer-to-words.spec.js create mode 100644 lab/exercises/10-mixed/network-delay-time-0.js create mode 100644 lab/exercises/10-mixed/network-delay-time-1.js create mode 100644 lab/exercises/10-mixed/network-delay-time.js create mode 100644 lab/exercises/10-mixed/network-delay-time.spec.js create mode 100644 lab/exercises/10-mixed/reorder-log-files.js create mode 100644 lab/exercises/10-mixed/reorder-log-files.spec.js create mode 100644 lab/exercises/10-mixed/rotated-binary-search-1.js create mode 100644 lab/exercises/10-mixed/rotated-binary-search.js create mode 100644 lab/exercises/10-mixed/rotated-binary-search.spec.js create mode 100644 lab/exercises/10-mixed/trapping-rain-water-1.js create mode 100644 lab/exercises/10-mixed/trapping-rain-water.js create mode 100644 lab/exercises/10-mixed/trapping-rain-water.spec.js diff --git a/.eslintrc.js b/.eslintrc.js index bfc96a26..ee4a630a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,7 +15,8 @@ module.exports = { // https://eslint.org/docs/rules/no-plusplus // allows unary operators ++ and -- in the afterthought (final expression) of a for loop. - 'no-plusplus': [2, { 'allowForLoopAfterthoughts': true }], + 'no-plusplus': [0, { 'allowForLoopAfterthoughts': true }], + 'no-continue': [0], // Allow for..of 'no-restricted-syntax': [0, 'ForOfStatement'], diff --git a/lab/exercises/10-mixed/2sum-1.js b/lab/exercises/10-mixed/2sum-1.js new file mode 100644 index 00000000..81ed21c8 --- /dev/null +++ b/lab/exercises/10-mixed/2sum-1.js @@ -0,0 +1,31 @@ + +/** + * Given a SORTED array and a target, return the indices of the 2 number that sum up target + * + * @param {number[]} nums + * @param {numer} target + * @returns + * + * @runtime O(n) + */ +function twoSum(nums, target) { + const len = nums.length - 1; + let lo = 0; + let hi = len; + + while (lo < hi && hi > 0 && lo < len) { + const sum = nums[lo] + nums[hi]; + if (sum === target) { + return [lo, hi]; + } + if (sum > target) { + hi--; + } else { + lo++; + } + } + + return []; +} + +module.exports = twoSum; diff --git a/lab/exercises/10-mixed/2sum.js b/lab/exercises/10-mixed/2sum.js new file mode 100644 index 00000000..5cc6ff63 --- /dev/null +++ b/lab/exercises/10-mixed/2sum.js @@ -0,0 +1,25 @@ + +/** + * Given an array and a target, return the indices of the 2 number that sum up target + * + * @param {number[]} nums + * @param {numer} target + * @returns + * + * @runtime O(n) + */ +function twoSum(nums, target) { + const map = new Map(); + + for (let i = 0; i < nums.length; i++) { + const diff = target - nums[i]; + if (map.has(diff)) { + return [map.get(diff), i]; + } + map.set(nums[i], i); + } + + return []; +} + +module.exports = twoSum; diff --git a/lab/exercises/10-mixed/2sum.spec.js b/lab/exercises/10-mixed/2sum.spec.js new file mode 100644 index 00000000..74832238 --- /dev/null +++ b/lab/exercises/10-mixed/2sum.spec.js @@ -0,0 +1,23 @@ +const fn = require('./2sum'); + +describe('2 sum', () => { + it('should work', () => { + expect(fn([-1, 0, 1], 0)).toEqual(expect.arrayContaining([0, 2])); + }); + + it('should work', () => { + expect(fn([2, 7, 11, 15], 9)).toEqual([0, 1]); + }); + + it('should work', () => { + expect(fn([2, 7, 11, 15], 18)).toEqual([1, 2]); + }); + + it('should be empty', () => { + expect(fn([2, 7, 11, 15], 1)).toEqual([]); + }); + + it('should should work with non-sorted', () => { + expect(fn([3, 2, 4], 6)).toEqual([1, 2]); + }); +}); diff --git a/lab/exercises/10-mixed/3sum-1.js b/lab/exercises/10-mixed/3sum-1.js new file mode 100644 index 00000000..33527a16 --- /dev/null +++ b/lab/exercises/10-mixed/3sum-1.js @@ -0,0 +1,29 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * + * @runtime O(n^3) + */ +function threeSum(nums) { + const ans = new Set(); + + for (let i = 0; i < nums.length; i++) { + for (let j = i + 1; j < nums.length; j++) { + for (let k = j + 1; k < nums.length; k++) { + if (nums[i] + nums[j] + nums[k] === 0) { + ans.add(JSON.stringify([nums[i], nums[j], nums[k]].sort())); + } + } + } + } + + return Array.from(ans).map((s) => JSON.parse(s)); +} + +module.exports = threeSum; + +// Given an array find the unique triplets elements that sum zero. + +// Brute force: O(n^3) +// Using twoSum: O(n^2) +// diff --git a/lab/exercises/10-mixed/3sum-2.js b/lab/exercises/10-mixed/3sum-2.js new file mode 100644 index 00000000..02389971 --- /dev/null +++ b/lab/exercises/10-mixed/3sum-2.js @@ -0,0 +1,47 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * + * @runtime O(n^2) + * @space O(n) + */ +const threeSum = function (nums) { + const array = nums.reduce((acc, n, i) => { // O(n^2) + if (i > nums.length - 2) return acc; + const partial = twoSum(nums, -n, i + 1); + const res = partial.map((p) => [n, ...p]); + // console.log({i, n, partial, res, acc}) + return acc.concat(res); + }, []); + + // remove dups + const set = array.reduce((acc, n) => { + const str = n.sort((a, b) => a - b).toString(); + return acc.add(str); + }, new Set()); + + // convert to array of nums + return [...set].map((a) => a.split(',').map((n) => +n)); +}; + +function twoSum(nums, target, start) { // O(n) + const ans = []; + const map = new Map(); + + for (let i = start; i < nums.length; i++) { + if (map.has(target - nums[i])) { + ans.push([target - nums[i], nums[i]]); + } + map.set(nums[i], i); + } + + return ans; +} + +module.exports = threeSum; + +// Given an array find the unique triplets elements that sum zero. + +// Brute force: O(n^3) +// Using twoSum: O(n^2) +// diff --git a/lab/exercises/10-mixed/3sum.js b/lab/exercises/10-mixed/3sum.js new file mode 100644 index 00000000..6837b34c --- /dev/null +++ b/lab/exercises/10-mixed/3sum.js @@ -0,0 +1,47 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * + * @runtime O(n^2) and skips duplicates + * @space O(1) + */ +function threeSum(nums) { + const ans = []; + + nums.sort((a, b) => a - b); // sort: O(n log n) + + for (let i = 0; i < nums.length - 2; i++) { // O(n^2) + if (i > 0 && nums[i - 1] === nums[i]) continue; // skip duplicates + + let lo = i + 1; + let hi = nums.length - 1; + + while (lo < hi) { + const sum = nums[i] + nums[lo] + nums[hi]; + if (sum === 0) { + ans.push([nums[i], nums[lo], nums[hi]]); + // console.log([nums[i], nums[lo], nums[hi]]); + lo++; + hi--; + while (lo < hi && nums[lo - 1] === nums[lo]) lo++; // skip duplicates + while (lo < hi && nums[hi + 1] === nums[hi]) hi--; // skip duplicates + } else if (sum < 0) { + lo++; + while (lo < hi && nums[lo - 1] === nums[lo]) lo++; // skip duplicates + } else { + hi--; + while (lo < hi && nums[hi + 1] === nums[hi]) hi--; // skip duplicates + } + } + } + + return ans; +} + +module.exports = threeSum; + +// Given an array find the unique triplets elements that sum zero. + +// Brute force: O(n^3) +// Using twoSum: O(n^2) +// diff --git a/lab/exercises/10-mixed/3sum.spec.js b/lab/exercises/10-mixed/3sum.spec.js new file mode 100644 index 00000000..862de0f2 --- /dev/null +++ b/lab/exercises/10-mixed/3sum.spec.js @@ -0,0 +1,44 @@ +const fn = require('./3sum'); + +describe('3 Sum', () => { + it('should work', () => { + expect(fn([-1, 0, 1, 2, -1, 4])).toEqual(expect.arrayContaining([ + expect.arrayContaining([-1, 0, 1]), + expect.arrayContaining([-1, 2, -1]), + ])); + }); + + it('should work', () => { + const actual = fn([-2, 0, 1, 1, 2]); + expect(actual.length).toEqual(2); + expect(actual).toEqual(expect.arrayContaining([ + expect.arrayContaining([-2, 0, 2]), + expect.arrayContaining([-2, 1, 1]), + ])); + }); + + it('should work', () => { + const actual = fn([-2, -4, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6]); + expect(actual.length).toEqual(6); + expect(actual).toEqual(expect.arrayContaining([ + expect.arrayContaining([-4, -2, 6]), + expect.arrayContaining([-4, 0, 4]), + expect.arrayContaining([-4, 1, 3]), + expect.arrayContaining([-4, 2, 2]), + expect.arrayContaining([-2, -2, 4]), + expect.arrayContaining([-2, 0, 2]), + ])); + }); + + it('should work with many zeros', () => { + const actual = fn(Array(5).fill(0)); + expect(actual.length).toEqual(1); + expect(JSON.stringify(actual)).toEqual('[[0,0,0]]'); // jest negative zero workaround + }); + + it('should work with large arrays', () => { + const actual = fn(Array(3000).fill(0)); + expect(actual.length).toEqual(1); + expect(JSON.stringify(actual)).toEqual('[[0,0,0]]'); + }); +}); diff --git a/lab/exercises/10-mixed/alien-dictionary.js b/lab/exercises/10-mixed/alien-dictionary.js new file mode 100644 index 00000000..07905d65 --- /dev/null +++ b/lab/exercises/10-mixed/alien-dictionary.js @@ -0,0 +1,109 @@ + +/** + * Add nodes and edges into a graph using adjacency list + * + * @class Graph + */ +class Graph { + constructor() { + this.nodes = new Map(); + } + + // add node or directed edge + add(node1, node2) { + // console.log({node1, node2}) + const adj = this.nodes.has(node1) ? this.nodes.get(node1) : new Set(); + if (node2) adj.add(node2); + this.nodes.set(node1, adj); + } +} + +/** + * DFS + tarjan for loop detection + * + * @param {Graph} g + * @param {Map} node + * @param {Set} set + * @param {Map} [parent=null] + * @param {Map} [grouping=new Map()] + * @param {number} [depth=0] + * @returns {boolean} true if has a loop, false otherwise + */ +function hasLoopOrAddToSet(g, node, set, parent = null, grouping = new Map(), depth = 0) { + if (set.has(node)) set.delete(node); + set.add(node); + grouping.set(node, depth); + + // console.log({node, adjs: g.nodes.get(node)}); + + for (const adj of g.nodes.get(node)) { + // if (adj === parent) continue; // only for indirected graph + + if (!grouping.has(adj)) { + if (hasLoopOrAddToSet(g, adj, set, node, grouping, depth + 1)) return true; + } + + const minGroup = Math.min(grouping.get(adj), grouping.get(node)); + grouping.set(node, minGroup); + + if (grouping.get(adj) === grouping.get(node)) return true; + } +} + + +/** + * Find the order of the alien alphabet given a list of words on lexicographical order. + * + * @param {string[]} words + * @return {string} The alien alphabet order. + */ +function alienOrder(words) { + const g = new Graph(); + if (!words || words.length < 2) return words && words.join(''); + + for (let i = 1; i < words.length; i++) { // O(n) * O(k) + const w1 = words[i - 1]; + const w2 = words[i]; + let j = 0; + + while (j < w1.length && j < w2.length && w1[j] === w2[j]) { // O(k), k = max word length + g.add(w1[j++]); + } + + if (j === w2.length && w1.length > w2.length) { + return ''; // shorter words should come first. + } + + if (w1[j]) g.add(w1[j], w2[j]); + [...w1.slice(j)].forEach((n) => g.add(n)); + [...w2.slice(j)].forEach((n) => g.add(n)); + } + + // console.log({ g: JSON.stringify(g) }); + // console.log({ g: g.nodes }); + + const set = new Set(); + for (const [node] of g.nodes) { // O(?) + if (hasLoopOrAddToSet(g, node, set)) { // DFS: O(E + V), V: total unique letters + return ''; + } + } + + return [...set].join(''); +} + +module.exports = alienOrder; + +// Find the order of the alien alphabet given a list of words on lexicographical order. + +// take words in pair, and build a dependency graph. + // skip while w1.char === w2.char + // add the first diff chars as a adj nodes + // add each letter as a node in the graph. + +// find the order of the alien alph + // iterate over each node + // dfs + tarjan to detect loops + // add each visited node to a set + // if there’s a loop return ‘’ + // return set diff --git a/lab/exercises/10-mixed/alien-dictionary.spec.js b/lab/exercises/10-mixed/alien-dictionary.spec.js new file mode 100644 index 00000000..0507b0a7 --- /dev/null +++ b/lab/exercises/10-mixed/alien-dictionary.spec.js @@ -0,0 +1,60 @@ +// npx jest lab/exercises/10-mixed/alien-dictionary.spec.js --watch +const alienOrder = require('./alien-dictionary'); + +describe('Alien Dictionary', () => { + it('should work', () => { + const words = ['wrt', 'wrtkj', 'wrtkjd']; + expect(Array.from(alienOrder(words))).toEqual(expect.arrayContaining(Array.from('djkrtw'))); + }); + + it('should work', () => { + const words = [ + 'wrt', + 'wrf', + 'er', + 'ett', + 'rftt', + ]; + expect(alienOrder(words)).toEqual('wertf'); + }); + + it('should work', () => { + const words = ['aac', 'aabb', 'aaba']; + expect(alienOrder(words)).toEqual('cba'); + }); + + it('should work', () => { + const words = ['ab', 'cd', 'ef', 'f', 'x', 'xb', 'xc', 'zd', 'ze']; + expect((alienOrder(words))).toEqual('abcdefxz'); + }); + + it('should work', () => { + const words = ['a', 'b', 'ca', 'cc']; + expect((alienOrder(words))).toEqual('abc'); + }); + + it('should detect loops', () => { + const words = ['z', 'x', 'z']; + expect((alienOrder(words))).toEqual(''); + }); + + it('should detect loops', () => { + const words = ['a', 'b', 'c', 'cc', 'ca']; + expect((alienOrder(words))).toEqual(''); + }); + + it('detects length issues (prefixes are first)', () => { + const words = ['ab', 'a']; + expect((alienOrder(words))).toEqual(''); + }); + + it('should work with one word and letter', () => { + const words = ['a']; + expect((alienOrder(words))).toEqual('a'); + }); + + it('should work with one word', () => { + const words = ['abc']; + expect(Array.from(alienOrder(words))).toEqual(expect.arrayContaining(Array.from('abc'))); + }); +}); diff --git a/lab/exercises/10-mixed/critical-connections-1.js b/lab/exercises/10-mixed/critical-connections-1.js new file mode 100644 index 00000000..c7ca5c6c --- /dev/null +++ b/lab/exercises/10-mixed/critical-connections-1.js @@ -0,0 +1,74 @@ +/** + * @param {number} n + * @param {number[][]} connections + * @return {number[][]} + */ +function criticalConnections(n, connections) { + const critical = []; + const graph = buildGraph(n, connections); + // console.log({graph}) + + for (let i = 0; i < connections.length; i++) { // O(|E| * [|V|^3 + |V|^2|E|]) = O(|V|^3|E| + |V|^2|E|^2) + const link = connections[i]; + if (isLinkCritical(link, graph)) { + critical.push(link); + } + } + + return critical; +} + +function buildGraph(n, connections) { + const graph = [...Array(n).keys()].reduce((map, i) => { + map.set(i, new Set()); + return map; + }, new Map()); + + connections.forEach(([i, j]) => { + const iAdj = graph.get(i); + iAdj.add(j); + const jAdj = graph.get(j); + jAdj.add(i); + }); + + return graph; +} + +function isLinkCritical(link, graph) { // DFS: O(|V|^2 * |E|+|V|) = O(|V|^3 + |V|^2|E|) + for (let i = 0; i < graph.size; i++) { + for (let j = 0; j < graph.size; j++) { + if (hasLink([i, j], link)) continue; + if (!isConnected(i, j, link, graph)) { // DFS: O(|E|+|V|) + // console.log({i, j, link}); + return true; + } + } + } + + return false; +} + +function hasLink(a, b) { + return (a[0] === b[0] && a[1] === b[1]) || (a[0] === b[1] && a[1] === b[0]); +} + +// DFS: O(|E|+|V|) +function isConnected(i, j, ignoreLink, graph, seen = new Set()) { + if (i === j) return true; + if (graph.get(i).has(j)) return true; + + for (const adj of graph.get(i)) { + if (hasLink([i, adj], ignoreLink)) continue; + + if (seen.has(adj)) continue; + seen.add(adj); + + if (isConnected(adj, j, ignoreLink, graph, seen)) { + return true; + } + } + + return false; +} + +module.exports = criticalConnections; diff --git a/lab/exercises/10-mixed/critical-connections.data.js b/lab/exercises/10-mixed/critical-connections.data.js new file mode 100644 index 00000000..c5e1631c --- /dev/null +++ b/lab/exercises/10-mixed/critical-connections.data.js @@ -0,0 +1,6 @@ +module.exports = { + test1000: { + n: 1000, + connections: [[1,0],[2,1],[3,1],[4,2],[5,4],[6,3],[7,4],[8,2],[9,4],[10,8],[11,5],[12,10],[13,0],[14,5],[15,5],[16,11],[17,1],[18,4],[19,10],[20,9],[21,18],[22,5],[23,18],[24,13],[25,8],[26,23],[27,1],[28,18],[29,1],[30,0],[31,13],[32,21],[33,27],[34,24],[35,24],[36,9],[37,16],[38,14],[39,15],[40,30],[41,8],[42,36],[43,36],[44,16],[45,3],[46,24],[47,9],[48,43],[49,46],[50,45],[51,17],[52,8],[53,19],[54,28],[55,14],[56,42],[57,25],[58,12],[59,43],[60,14],[61,50],[62,30],[63,37],[64,36],[65,53],[66,39],[67,64],[68,29],[69,9],[70,53],[71,29],[72,17],[73,17],[74,35],[75,65],[76,12],[77,56],[78,44],[79,5],[80,43],[81,14],[82,40],[83,60],[84,40],[85,41],[86,13],[87,46],[88,56],[89,85],[90,76],[91,8],[92,33],[93,33],[94,26],[95,54],[96,6],[97,7],[98,66],[99,33],[100,5],[101,90],[102,68],[103,12],[104,65],[105,31],[106,93],[107,81],[108,91],[109,56],[110,17],[111,54],[112,63],[113,47],[114,44],[115,50],[116,0],[117,6],[118,67],[119,37],[120,30],[121,24],[122,121],[123,2],[124,51],[125,85],[126,61],[127,54],[128,124],[129,90],[130,8],[131,73],[132,21],[133,127],[134,26],[135,50],[136,108],[137,0],[138,28],[139,4],[140,79],[141,121],[142,93],[143,59],[144,112],[145,119],[146,97],[147,46],[148,103],[149,121],[150,148],[151,81],[152,134],[153,93],[154,69],[155,139],[156,44],[157,153],[158,145],[159,1],[160,109],[161,138],[162,87],[163,4],[164,25],[165,48],[166,139],[167,68],[168,28],[169,148],[170,164],[171,65],[172,132],[173,39],[174,159],[175,126],[176,44],[177,171],[178,99],[179,48],[180,125],[181,37],[182,152],[183,164],[184,107],[185,42],[186,54],[187,50],[188,181],[189,29],[190,113],[191,67],[192,169],[193,190],[194,46],[195,20],[196,195],[197,79],[198,165],[199,177],[200,183],[201,13],[202,22],[203,103],[204,143],[205,142],[206,65],[207,68],[208,56],[209,113],[210,66],[211,34],[212,70],[213,73],[214,14],[215,98],[216,198],[217,201],[218,13],[219,81],[220,159],[221,144],[222,47],[223,23],[224,26],[225,102],[226,33],[227,99],[228,94],[229,10],[230,113],[231,59],[232,172],[233,111],[234,131],[235,126],[236,155],[237,163],[238,183],[239,100],[240,42],[241,226],[242,213],[243,236],[244,82],[245,171],[246,18],[247,11],[248,179],[249,110],[250,105],[251,189],[252,18],[253,120],[254,164],[255,99],[256,108],[257,249],[258,54],[259,80],[260,193],[261,74],[262,206],[263,231],[264,91],[265,115],[266,213],[267,142],[268,254],[269,239],[270,6],[271,74],[272,221],[273,22],[274,7],[275,218],[276,129],[277,1],[278,96],[279,176],[280,102],[281,174],[282,267],[283,15],[284,154],[285,94],[286,285],[287,83],[288,43],[289,4],[290,141],[291,241],[292,144],[293,229],[294,129],[295,262],[296,228],[297,218],[298,128],[299,147],[300,118],[301,123],[302,250],[303,268],[304,68],[305,213],[306,4],[307,91],[308,4],[309,23],[310,284],[311,139],[312,238],[313,136],[314,254],[315,262],[316,75],[317,216],[318,181],[319,67],[320,303],[321,302],[322,208],[323,287],[324,93],[325,234],[326,57],[327,322],[328,200],[329,19],[330,307],[331,97],[332,286],[333,294],[334,119],[335,117],[336,264],[337,158],[338,91],[339,254],[340,207],[341,274],[342,32],[343,209],[344,163],[345,258],[346,317],[347,1],[348,151],[349,55],[350,183],[351,324],[352,31],[353,115],[354,337],[355,117],[356,217],[357,337],[358,183],[359,233],[360,179],[361,188],[362,234],[363,111],[364,99],[365,0],[366,136],[367,334],[368,251],[369,308],[370,11],[371,295],[372,291],[373,6],[374,140],[375,230],[376,342],[377,274],[378,84],[379,111],[380,208],[381,138],[382,116],[383,273],[384,176],[385,383],[386,273],[387,231],[388,286],[389,4],[390,333],[391,384],[392,238],[393,333],[394,149],[395,164],[396,212],[397,391],[398,312],[399,374],[400,393],[401,394],[402,183],[403,223],[404,56],[405,331],[406,253],[407,334],[408,148],[409,136],[410,254],[411,57],[412,285],[413,352],[414,19],[415,44],[416,173],[417,251],[418,127],[419,190],[420,155],[421,319],[422,32],[423,2],[424,124],[425,325],[426,398],[427,261],[428,68],[429,225],[430,260],[431,289],[432,187],[433,155],[434,27],[435,351],[436,20],[437,218],[438,36],[439,4],[440,187],[441,96],[442,389],[443,67],[444,364],[445,235],[446,326],[447,181],[448,269],[449,333],[450,77],[451,190],[452,436],[453,399],[454,23],[455,368],[456,142],[457,14],[458,51],[459,275],[460,410],[461,252],[462,40],[463,159],[464,383],[465,284],[466,229],[467,92],[468,248],[469,276],[470,80],[471,291],[472,367],[473,379],[474,234],[475,243],[476,121],[477,182],[478,64],[479,22],[480,244],[481,306],[482,113],[483,391],[484,39],[485,247],[486,409],[487,473],[488,176],[489,287],[490,155],[491,289],[492,35],[493,342],[494,299],[495,1],[496,178],[497,341],[498,339],[499,374],[500,394],[501,332],[502,85],[503,352],[504,5],[505,203],[506,0],[507,60],[508,87],[509,348],[510,53],[511,197],[512,228],[513,159],[514,488],[515,158],[516,230],[517,489],[518,439],[519,278],[520,268],[521,380],[522,278],[523,213],[524,190],[525,80],[526,257],[527,391],[528,220],[529,272],[530,501],[531,381],[532,1],[533,32],[534,22],[535,35],[536,262],[537,475],[538,366],[539,132],[540,184],[541,213],[542,315],[543,328],[544,26],[545,267],[546,180],[547,408],[548,190],[549,173],[550,422],[551,148],[552,251],[553,551],[554,29],[555,234],[556,179],[557,550],[558,486],[559,186],[560,201],[561,40],[562,494],[563,133],[564,453],[565,279],[566,244],[567,395],[568,353],[569,492],[570,433],[571,140],[572,428],[573,37],[574,519],[575,227],[576,449],[577,38],[578,531],[579,422],[580,341],[581,207],[582,318],[583,439],[584,185],[585,73],[586,342],[587,208],[588,102],[589,388],[590,582],[591,467],[592,293],[593,185],[594,518],[595,262],[596,126],[597,544],[598,441],[599,444],[600,488],[601,72],[602,267],[603,491],[604,472],[605,295],[606,228],[607,385],[608,298],[609,416],[610,541],[611,69],[612,7],[613,255],[614,166],[615,469],[616,277],[617,174],[618,79],[619,470],[620,249],[621,259],[622,323],[623,149],[624,241],[625,358],[626,19],[627,555],[628,539],[629,242],[630,258],[631,210],[632,442],[633,398],[634,233],[635,471],[636,594],[637,99],[638,188],[639,212],[640,339],[641,572],[642,306],[643,78],[644,391],[645,383],[646,3],[647,171],[648,224],[649,200],[650,35],[651,530],[652,641],[653,533],[654,598],[655,431],[656,614],[657,43],[658,35],[659,640],[660,167],[661,369],[662,467],[663,352],[664,512],[665,241],[666,202],[667,84],[668,28],[669,628],[670,321],[671,272],[672,660],[673,270],[674,350],[675,565],[676,281],[677,60],[678,163],[679,413],[680,350],[681,426],[682,467],[683,190],[684,476],[685,575],[686,556],[687,142],[688,678],[689,411],[690,114],[691,646],[692,197],[693,475],[694,232],[695,37],[696,346],[697,38],[698,407],[699,121],[700,655],[701,628],[702,324],[703,217],[704,472],[705,102],[706,337],[707,358],[708,623],[709,131],[710,313],[711,654],[712,161],[713,471],[714,526],[715,398],[716,249],[717,709],[718,486],[719,433],[720,323],[721,705],[722,436],[723,599],[724,391],[725,528],[726,208],[727,310],[728,622],[729,51],[730,377],[731,46],[732,88],[733,567],[734,692],[735,700],[736,218],[737,704],[738,342],[739,471],[740,533],[741,571],[742,348],[743,245],[744,189],[745,655],[746,122],[747,94],[748,283],[749,378],[750,717],[751,93],[752,662],[753,746],[754,557],[755,165],[756,554],[757,658],[758,691],[759,454],[760,553],[761,644],[762,155],[763,496],[764,68],[765,330],[766,124],[767,406],[768,339],[769,65],[770,712],[771,714],[772,769],[773,367],[774,34],[775,117],[776,193],[777,452],[778,364],[779,467],[780,11],[781,137],[782,552],[783,767],[784,0],[785,228],[786,281],[787,295],[788,24],[789,619],[790,751],[791,296],[792,9],[793,236],[794,330],[795,37],[796,665],[797,447],[798,267],[799,95],[800,697],[801,560],[802,489],[803,97],[804,179],[805,798],[806,665],[807,278],[808,336],[809,727],[810,512],[811,629],[812,519],[813,319],[814,730],[815,203],[816,797],[817,75],[818,380],[819,426],[820,212],[821,760],[822,807],[823,591],[824,810],[825,233],[826,564],[827,366],[828,1],[829,678],[830,696],[831,234],[832,70],[833,610],[834,668],[835,237],[836,466],[837,611],[838,419],[839,297],[840,351],[841,806],[842,468],[843,839],[844,319],[845,338],[846,33],[847,290],[848,641],[849,794],[850,291],[851,613],[852,771],[853,449],[854,607],[855,132],[856,454],[857,287],[858,530],[859,689],[860,505],[861,785],[862,428],[863,528],[864,840],[865,90],[866,768],[867,218],[868,59],[869,655],[870,360],[871,497],[872,428],[873,511],[874,445],[875,163],[876,594],[877,78],[878,556],[879,340],[880,84],[881,536],[882,446],[883,413],[884,282],[885,193],[886,607],[887,130],[888,198],[889,17],[890,408],[891,554],[892,331],[893,673],[894,44],[895,662],[896,652],[897,14],[898,600],[899,109],[900,300],[901,710],[902,100],[903,23],[904,759],[905,346],[906,109],[907,235],[908,651],[909,113],[910,769],[911,909],[912,259],[913,522],[914,582],[915,720],[916,169],[917,208],[918,136],[919,381],[920,69],[921,781],[922,1],[923,118],[924,432],[925,390],[926,827],[927,118],[928,330],[929,88],[930,141],[931,416],[932,633],[933,879],[934,69],[935,897],[936,582],[937,850],[938,597],[939,740],[940,462],[941,853],[942,826],[943,387],[944,870],[945,451],[946,763],[947,817],[948,803],[949,411],[950,363],[951,843],[952,132],[953,622],[954,249],[955,85],[956,613],[957,315],[958,667],[959,625],[960,282],[961,259],[962,917],[963,305],[964,73],[965,25],[966,786],[967,196],[968,527],[969,877],[970,732],[971,124],[972,755],[973,94],[974,176],[975,78],[976,141],[977,479],[978,63],[979,295],[980,201],[981,558],[982,941],[983,110],[984,196],[985,82],[986,559],[987,22],[988,400],[989,865],[990,947],[991,687],[992,492],[993,309],[994,810],[995,733],[996,595],[997,93],[998,547],[999,663],[487,202],[888,260],[643,239],[637,365],[183,74],[833,290],[602,144],[565,107],[650,610],[843,606],[114,112],[937,117],[479,207],[721,296],[198,177],[823,300],[520,132],[973,308],[696,525],[996,43],[318,33],[877,197],[676,238],[835,553],[492,17],[559,151],[919,357],[628,425],[810,638],[998,983],[528,398],[786,382],[619,209],[257,198],[919,222],[434,406],[445,299],[704,560],[904,774],[667,282],[679,23],[745,219],[59,57],[257,113],[155,117],[890,732],[840,818],[399,383],[465,131],[888,303],[633,631],[526,435],[499,30],[870,816],[988,17],[610,47],[885,310],[859,601],[716,278],[977,792],[819,307],[591,174],[979,92],[549,353],[513,329],[750,171],[843,522],[452,303],[891,607],[95,78],[784,337],[443,51],[871,491],[935,478],[977,645],[460,251],[688,100],[619,614],[834,495],[784,524],[919,891],[568,283],[988,880],[884,664],[785,591],[347,263],[826,659],[966,401],[890,342],[791,769],[641,603],[338,302],[611,155],[620,494],[484,218],[306,135],[913,16],[470,267],[72,5],[390,211],[794,487],[450,330],[446,69],[433,91],[638,171],[572,69],[287,247],[529,103],[795,58],[733,608],[986,232],[478,469],[858,245],[981,96],[819,700],[693,361],[842,670],[823,672],[909,588],[961,418],[673,178],[409,395],[388,114],[692,569],[919,777],[219,68],[960,683],[881,308],[916,465],[299,77],[683,630],[897,448],[788,296],[812,632],[943,465],[83,56],[994,617],[875,22],[886,412],[836,758],[577,103],[981,99],[859,126],[195,129],[636,484],[922,253],[477,359],[983,443],[534,253],[973,503],[798,480],[789,300],[686,514],[469,342],[838,721],[889,363],[929,526],[604,141],[335,31],[862,616],[970,225],[957,466],[533,341],[485,4],[549,432],[905,210],[557,105],[794,625],[415,265],[720,115],[862,642],[153,30],[867,588],[724,19],[507,488],[778,281],[495,28],[869,274],[859,60],[496,41],[982,436],[354,192],[734,567],[584,374],[770,292],[863,258],[510,375],[989,311],[349,99],[834,311],[934,851],[595,584],[223,135],[223,144],[606,216],[837,748],[129,5],[257,19],[464,318],[670,228],[879,848],[636,439],[243,206],[973,647],[362,215],[331,211],[737,139],[701,239],[968,578],[627,138],[950,908],[835,651],[574,84],[964,378],[630,558],[435,243],[185,39],[771,560],[551,495],[699,19],[969,574],[865,700],[599,323],[897,254],[610,183],[590,521],[205,117],[325,84],[938,547],[780,500],[952,441],[699,254],[882,233],[727,46],[417,318],[653,171],[777,413],[946,444],[789,323],[704,473],[985,170],[760,389],[709,538],[896,697],[795,81],[683,482],[941,895],[585,278],[472,41],[816,470],[673,382],[591,441],[591,63],[810,198],[610,524],[43,12],[699,112],[956,149],[602,111],[893,265],[748,18],[530,342],[978,374],[269,82],[310,15],[425,313],[609,341],[953,500],[771,348],[950,452],[923,890],[370,139],[848,515],[750,323],[788,218],[675,133],[501,174],[966,35],[595,209],[617,18],[887,255],[549,148],[677,94],[787,610],[737,129],[829,49],[788,637],[610,515],[402,193],[176,149],[660,435],[490,62],[886,877],[258,14],[930,716],[940,742],[971,298],[749,460],[704,423],[964,325],[436,197],[908,428],[859,193],[327,213],[906,99],[921,612],[621,586],[636,434],[962,71],[814,24],[267,188],[675,198],[929,459],[357,97],[687,635],[753,331],[838,157],[856,816],[786,447],[470,178],[675,385],[724,204],[501,88],[817,185],[244,9],[749,173],[805,691],[461,304],[335,72],[519,451],[322,139],[911,175],[923,87],[708,106],[191,71],[954,96],[683,530],[899,93],[748,718],[885,312],[539,139],[337,16],[988,567],[554,262],[496,416],[765,464],[828,125],[576,217],[276,239],[946,844],[452,434],[803,765],[892,658],[816,765],[869,319],[976,317],[875,156],[396,22],[933,717],[938,608],[296,240],[612,319],[960,218],[284,144],[727,538],[654,163],[318,281],[361,344],[628,35],[494,226],[572,285],[879,561],[449,239],[955,421],[575,463],[26,12],[581,18],[431,25],[964,478],[845,316],[898,12],[460,128],[811,759],[187,75],[710,703],[741,503],[147,88],[437,302],[951,671],[725,139],[851,265],[700,289],[902,636],[512,425],[243,162],[708,386],[252,141],[20,13],[811,161],[762,416],[497,383],[879,476],[637,108],[333,158],[940,172],[376,341],[753,689],[158,27],[699,541],[405,358],[649,62],[426,24],[665,271],[963,580],[263,6],[925,575],[816,148],[509,475],[485,12],[938,896],[964,532],[892,43],[44,39],[621,540],[262,199],[810,128],[881,749],[609,92],[812,17],[983,242],[735,502],[989,282],[885,154],[679,365],[466,405],[991,570],[883,171],[865,30],[285,235],[801,419],[517,36],[920,567],[914,359],[993,568],[609,352],[403,382],[425,185],[545,469],[692,229],[478,227],[977,778],[941,710],[728,51],[420,218],[659,533],[416,213],[412,387],[755,19],[878,489],[640,67],[527,369],[624,283],[176,157],[632,148],[581,311],[660,564],[786,287],[738,554],[512,102],[663,376],[706,300],[661,140],[933,517],[776,532],[660,509],[122,20],[92,88],[715,415],[852,326],[246,136],[602,466],[161,117],[524,379],[261,199],[901,631],[779,508],[353,342],[488,74],[225,208],[365,339],[628,468],[409,379],[188,114],[709,152],[727,323],[760,134],[829,262],[834,363],[612,72],[289,113],[523,4],[534,242],[401,335],[369,29],[638,400],[535,14],[836,791],[711,691],[499,253],[973,861],[724,435],[852,504],[871,90],[965,928],[743,658],[437,422],[95,38],[625,583],[567,496],[640,182],[617,166],[910,184],[967,331],[792,563],[717,152],[876,338],[257,189],[139,16],[130,20],[559,538],[814,316],[423,54],[764,513],[795,428],[629,341],[571,96],[652,566],[230,208],[943,748],[555,189],[247,244],[737,7],[326,248],[632,599],[902,684],[929,380],[825,139],[876,762],[781,116],[544,79],[248,67],[734,230],[672,117],[837,154],[562,439],[795,641],[971,382],[473,436],[913,191],[859,796],[912,47],[323,264],[813,695],[605,271],[520,407],[845,450],[969,93],[879,289],[790,73],[965,426],[374,1],[881,815],[931,662],[496,187],[996,451],[611,261],[965,664],[785,589],[506,72],[778,320],[750,167],[368,79],[787,721],[943,429],[699,18],[765,119],[507,293],[557,342],[313,210],[955,871],[266,240],[795,567],[761,414],[955,845],[554,30],[819,602],[945,17],[955,807],[693,331],[232,71],[931,282],[987,924],[721,521],[913,388],[979,582],[991,6],[786,457],[660,426],[928,770],[583,525],[758,94],[153,151],[222,141],[411,378],[786,234],[564,428],[624,112],[646,359],[945,227],[298,172],[219,118],[687,502],[892,16],[965,456],[949,31],[990,690],[988,527],[722,225],[517,467],[748,673],[104,80],[722,146],[495,477],[465,415],[905,316],[724,257],[973,524],[660,231],[829,110],[423,40],[776,248],[869,738],[415,336],[807,242],[608,15],[686,589],[251,171],[700,12],[390,355],[842,654],[987,610],[830,97],[923,413],[173,82],[935,395],[415,354],[425,352],[821,633],[416,280],[466,285],[326,21],[677,164],[493,45],[703,245],[790,766],[772,743],[841,544],[942,270],[805,619],[704,696],[898,586],[986,605],[528,46],[819,814],[844,523],[632,411],[805,646],[473,161],[797,41],[887,217],[989,136],[715,295],[527,48],[942,57],[767,664],[442,18],[972,100],[736,346],[736,96],[728,530],[683,161],[564,390],[496,431],[870,730],[805,266],[751,305],[726,508],[454,244],[901,401],[866,311],[583,546],[407,190],[565,476],[629,557],[589,58],[759,4],[261,195],[698,599],[332,283],[482,116],[911,393],[958,428],[471,260],[393,3],[663,401],[945,212],[183,109],[501,45],[362,109],[788,706],[634,418],[908,47],[877,128],[628,377],[875,12],[937,904],[434,52],[697,407],[853,490],[471,335],[508,285],[594,308],[117,29],[662,356],[599,69],[883,595],[627,536],[414,208],[809,23],[719,351],[818,517],[582,89],[411,313],[332,207],[480,473],[216,18],[336,3],[810,482],[251,176],[990,886],[737,617],[356,268],[946,832],[451,287],[777,420],[825,115],[922,82],[871,96],[803,395],[996,817],[901,891],[516,163],[736,721],[189,139],[776,569],[138,99],[349,204],[550,542],[779,357],[647,485],[924,127],[867,277],[731,714],[890,776],[960,395],[686,429],[830,341],[902,109],[455,100],[544,365],[680,525],[807,282],[535,503],[811,574],[641,573],[755,283],[782,93],[572,361],[925,843],[402,328],[942,845],[918,424],[737,476],[723,97],[556,480],[268,115],[651,417],[711,97],[395,308],[762,577],[886,735],[487,349],[138,109],[847,479],[916,646],[969,808],[164,81],[97,36],[529,64],[289,86],[993,444],[710,320],[525,522],[595,311],[361,180],[983,880],[334,37],[442,351],[879,563],[596,240],[694,456],[285,40],[363,139],[487,203],[950,880],[878,584],[744,236],[804,78],[483,49],[234,21],[795,473],[678,164],[565,440],[882,679],[401,114],[641,366],[922,900],[748,460],[248,219],[601,447],[441,64],[421,334],[894,75],[592,303],[338,157],[925,690],[887,614],[538,136],[275,120],[762,168],[947,780],[938,601],[914,436],[808,770],[617,315],[654,503],[744,319],[205,21],[861,736],[366,247],[724,222],[435,112],[604,378],[798,559],[408,63],[545,526],[957,371],[827,275],[209,164],[864,495],[277,107],[948,504],[432,152],[854,381],[926,79],[772,521],[695,71],[762,21],[647,60],[503,205],[590,345],[797,364],[926,78],[809,390],[933,826],[966,446],[627,506],[705,343],[873,550],[759,753],[693,423],[556,297],[467,260],[574,277],[389,371],[814,618],[499,268],[475,224],[100,76],[868,255],[845,77],[877,93],[851,778],[617,578],[773,617],[508,242],[809,374],[426,2],[315,137],[212,10],[678,156],[466,342],[279,266],[516,293],[929,474],[838,512],[764,335],[539,468],[278,56],[716,329],[976,441],[483,168],[290,148],[877,475],[868,513],[783,744],[364,308],[852,76],[940,375],[864,592],[391,252],[516,43],[813,311],[58,43],[897,628],[919,120],[430,322],[866,40],[952,872],[760,481],[792,186],[48,34],[828,738],[869,341],[118,49],[532,366],[522,448],[609,34],[848,625],[428,194],[922,867],[86,50],[489,463],[311,32],[726,291],[881,644],[547,294],[480,149],[846,303],[714,420],[154,39],[166,153],[611,609],[948,603],[839,81],[250,189],[683,325],[894,769],[438,24],[228,114],[966,944],[138,50],[816,49],[635,501],[773,506],[449,434],[413,10],[971,144],[951,946],[841,227],[350,171],[500,333],[539,389],[841,445],[550,318],[626,257],[318,273],[545,16],[579,147],[547,505],[985,40],[805,538],[669,274],[954,678],[843,581],[181,55],[493,124],[835,152],[929,713],[131,109],[243,19],[941,7],[911,832],[742,85],[250,170],[764,278],[636,63],[404,361],[632,615],[566,509],[961,809],[545,517],[759,657],[782,105],[383,381],[725,561],[923,512],[813,559],[878,116],[392,303],[740,47],[940,672],[809,382],[611,416],[745,575],[942,380],[556,328],[664,294],[393,360],[525,427],[970,328],[846,735],[191,110],[702,692],[965,180],[536,409],[685,247],[553,328],[565,426],[797,485],[280,252],[626,609],[857,629],[478,18],[555,129],[970,703],[964,303],[486,58],[354,139],[812,66],[942,599],[484,96],[518,283],[817,108],[738,80],[668,492],[873,724],[929,519],[848,287],[413,391],[504,470],[295,54],[924,62],[303,2],[439,318],[961,171],[811,189],[966,878],[685,655],[760,394],[904,373],[284,48],[302,267],[869,768],[670,74],[782,576],[999,778],[814,55],[896,372],[777,293],[853,653],[520,36],[263,53],[363,213],[901,418],[702,689],[489,444],[923,491],[698,18],[899,120],[619,182],[223,196],[876,366],[904,495],[617,67],[997,71],[691,678],[950,690],[280,192],[323,158],[731,24],[530,131],[931,187],[838,213],[728,75],[567,56],[754,177],[320,282],[914,418],[852,325],[140,14],[959,145],[203,78],[880,449],[555,287],[826,340],[954,50],[980,531],[300,255],[77,0],[92,0],[441,338],[381,11],[444,398],[115,3],[520,335],[129,43],[815,469],[446,115],[575,96],[604,485],[691,675],[982,779],[804,395],[480,194],[864,582],[929,682],[874,133],[391,70],[865,164],[950,515],[136,26],[680,157],[557,483],[845,195],[836,522],[692,512],[406,161],[664,605],[913,30],[699,51],[935,394],[925,269],[296,8],[645,71],[921,274],[797,597],[728,480],[196,178],[555,317],[711,400],[784,509],[827,657],[989,713],[787,599],[624,238],[869,828],[267,194],[552,288],[814,286],[344,271],[782,4],[889,409],[365,227],[167,117],[452,182],[957,577],[844,522],[577,29],[729,196],[493,303],[749,540],[537,115],[829,770],[979,861],[211,6],[851,132],[542,66],[406,238],[476,360],[553,421],[162,32],[743,106],[622,387],[748,142],[328,244],[639,33],[127,34],[894,299],[763,316],[252,127],[596,105],[479,259],[132,46],[392,324],[651,6],[416,94],[629,488],[606,296],[847,181],[566,130],[697,146],[647,600],[536,79],[542,79],[823,631],[518,190],[419,32],[659,496],[569,316],[752,685],[83,51],[952,87],[628,351],[647,10],[858,814],[946,106],[895,719],[596,523],[880,115],[507,89],[727,135],[746,12],[751,340],[728,297],[296,124],[865,263],[603,423],[972,817],[242,40],[997,963],[552,231],[278,143],[89,73],[355,60],[431,262],[708,638],[683,314],[451,390],[190,50],[867,367],[909,387],[45,32],[534,6],[348,273],[594,306],[933,208],[223,79],[963,605],[672,616],[995,670],[549,532],[719,63],[927,744],[626,72],[920,21],[982,206],[906,65],[530,271],[664,436],[850,314],[663,258],[990,171],[738,139],[628,290],[683,62],[236,235],[294,11],[844,242],[973,799],[713,398],[726,682],[946,717],[966,294],[656,476],[35,28],[791,123],[327,110],[658,68],[584,569],[347,242],[201,82],[721,595],[756,372],[667,129],[625,193],[713,360],[77,7],[884,879],[861,646],[512,108],[699,507],[850,178],[174,147],[371,25],[977,217],[236,188],[495,131],[932,63],[556,100],[645,0],[893,48],[941,837],[561,67],[614,415],[303,53],[715,161],[225,76],[665,356],[459,73],[604,559],[484,385],[769,206],[748,29],[980,812],[603,6],[728,628],[596,345],[863,565],[724,419],[838,410],[987,839],[909,171],[316,161],[108,99],[893,614],[827,424],[587,397],[612,352],[400,243],[481,458],[561,320],[511,495],[876,660],[910,667],[702,426],[543,163],[962,611],[499,417],[728,564],[800,734],[595,298],[863,259],[888,85],[629,616],[728,539],[869,53],[827,15],[769,41],[195,189],[551,505],[402,359],[336,17],[721,261],[917,724],[253,109],[557,385],[897,98],[117,48],[830,277],[989,33],[810,122],[500,118],[590,121],[451,216],[462,224],[861,589],[364,118],[108,26],[615,345],[633,82],[410,38],[719,485],[843,114],[985,119],[849,137],[962,657],[984,331],[425,369],[409,140],[677,414],[702,608],[867,317],[815,649],[717,506],[976,882],[783,242],[937,929],[650,387],[142,133],[964,140],[688,521],[862,130],[617,271],[770,227],[655,267],[863,47],[559,488],[609,440],[428,231],[460,25],[504,12],[551,163],[882,275],[555,76],[631,331],[401,182],[212,74],[917,860],[233,200],[225,104],[199,159],[48,4],[813,432],[914,483],[598,234],[893,202],[558,198],[490,232],[796,726],[693,390],[987,454],[883,560],[975,120],[955,747],[873,553],[505,183],[786,731],[663,317],[468,385],[580,183],[976,102],[755,523],[640,402],[715,707],[431,175],[724,519],[862,595],[614,13],[604,222],[556,467],[310,308],[430,275],[634,415],[856,125],[946,186],[758,91],[758,372],[956,856],[760,635],[551,520],[530,200],[758,566],[514,153],[880,851],[965,592],[976,240],[348,346],[816,674],[607,454],[779,603],[966,403],[639,259],[360,178],[487,461],[278,149],[240,134],[901,569],[987,127],[983,696],[889,118],[206,36],[851,762],[604,18],[969,24],[639,350],[747,579],[916,774],[402,27],[116,84],[351,91],[340,274],[784,390],[856,514],[877,270],[224,205],[991,785],[486,97],[443,310],[833,421],[949,925],[811,2],[829,612],[906,888],[204,86],[843,107],[607,53],[946,360],[848,215],[165,130],[731,437],[959,212],[82,41],[813,200],[931,93],[748,40],[434,224],[98,57],[830,694],[377,277],[386,37],[906,674],[950,36],[596,339],[962,790],[300,204],[847,537],[420,227],[943,632],[148,110],[347,169],[751,32],[729,626],[729,510],[852,224],[978,658],[483,325],[345,289],[801,53],[119,65],[140,13],[804,424],[897,125],[971,399],[989,144],[601,486],[694,92],[681,676],[999,936],[713,315],[682,49],[549,186],[266,36],[156,46],[646,238],[479,19],[603,102],[889,186],[693,453],[307,122],[959,311],[183,129],[712,333],[754,182],[690,472],[820,457],[599,507],[184,166],[892,483],[696,55],[686,68],[371,230],[641,383],[997,889],[668,194],[970,748],[437,26],[956,863],[934,4],[317,188],[747,703],[550,264],[440,5],[757,477],[481,463],[210,65],[420,387],[294,8],[689,347],[991,235],[851,358],[697,597],[511,264],[685,276],[890,417],[904,60],[210,183],[965,87],[906,235],[960,352],[712,278],[324,126],[792,187],[923,375],[157,126],[914,812],[891,585],[796,349],[980,744],[977,96],[710,365],[648,75],[205,108],[533,303],[940,467],[720,437],[470,458],[941,177],[967,345],[819,156],[547,14],[879,436],[249,44],[669,369],[715,206],[335,187],[808,106],[890,0],[973,833],[521,328],[709,159],[650,629],[459,63],[290,177],[279,16],[725,332],[87,23],[785,744],[679,245],[931,368],[894,413],[534,405],[828,441],[815,106],[720,325],[820,271],[623,218],[400,245],[908,799],[872,788],[750,189],[866,423],[879,833],[393,207],[628,10],[868,76],[557,344],[111,6],[985,518],[910,109],[495,117],[213,161],[751,98],[809,103],[688,548],[656,578],[412,4],[587,403],[261,219],[842,740],[456,155],[882,340],[586,19],[779,678],[209,8],[543,106],[818,29],[868,527],[710,203],[917,563],[731,38],[962,686],[966,949],[927,426],[750,283],[537,186],[949,643],[211,53],[961,174],[977,970],[941,630],[938,693],[207,125],[967,705],[315,133],[317,144],[686,551],[955,938],[785,757],[696,502],[832,658],[753,732],[668,192],[493,238],[586,459],[358,293],[486,112],[744,60],[867,612],[498,230],[156,79],[805,222],[177,11],[776,561],[679,491],[994,592],[910,48],[974,769],[689,80],[304,216],[316,0],[816,357],[879,381],[507,49],[844,587],[953,108],[975,615],[951,252],[600,244],[480,188],[972,465],[843,69],[367,270],[927,343],[788,305],[993,958],[177,37],[864,506],[984,894],[480,141],[539,524],[225,63],[891,550],[427,383],[526,37],[998,195],[940,805],[105,68],[782,749],[662,349],[480,270],[368,81],[681,650],[436,3],[409,313],[878,69],[352,313],[966,636],[562,200],[126,33],[386,380],[366,307],[877,139],[800,161],[704,168],[930,450],[533,202],[600,69],[486,294],[587,269],[529,520],[560,309],[777,249],[423,298],[942,532],[670,0],[967,189],[989,908],[425,421],[785,545],[770,718],[951,158],[667,556],[399,245],[490,74],[839,226],[739,402],[958,941],[652,515],[760,578],[733,682],[901,387],[543,448],[730,697],[452,264],[405,329],[820,810],[724,154],[653,85],[550,121],[901,193],[876,28],[130,122],[677,521],[510,273],[954,36],[493,138],[165,156],[851,274],[713,200],[220,12],[408,260],[327,49],[476,465],[921,788],[348,6],[615,452],[971,556],[893,278],[645,8],[694,650],[809,502],[754,195],[487,257],[829,762],[925,449],[796,117],[734,361],[848,324],[989,532],[932,173],[610,506],[315,4],[702,63],[970,736],[510,385],[380,96],[788,455],[166,141],[760,87],[653,173],[602,454],[836,363],[394,249],[405,163],[612,403],[679,76],[538,381],[936,197],[756,459],[733,659],[120,2],[262,141],[758,496],[965,800],[391,37],[939,934],[432,285],[591,411],[263,101],[133,27],[915,10],[957,599],[554,39],[446,168],[773,178],[847,13],[226,3],[966,655],[704,149],[557,424],[596,327],[699,542],[899,706],[399,376],[100,30],[976,23],[920,645],[479,125],[661,340],[893,712],[703,192],[871,264],[266,238],[490,75],[333,219],[629,575],[398,333],[615,49],[641,545],[313,275],[803,299],[717,166],[826,421],[919,546],[736,43],[233,19],[948,382],[508,76],[732,104],[511,272],[681,111],[564,497],[974,453],[288,184],[946,681],[721,335],[741,100],[820,39],[611,457],[983,229],[585,316],[627,198],[644,379],[847,507],[687,0],[813,396],[670,163],[278,107],[952,25],[992,290],[401,342],[943,306],[738,549],[962,921],[968,468],[725,326],[780,45],[337,252],[966,42],[794,783],[866,1],[695,466],[931,375],[981,802],[548,464],[710,364],[986,299],[539,460],[940,63],[835,122],[518,493],[721,142],[707,97],[473,178],[667,562],[757,576],[565,438],[697,625],[735,643],[935,713],[710,418],[449,232],[313,263],[483,175],[991,246],[422,348],[151,119],[831,293],[501,463],[531,174],[632,286],[935,598],[828,339],[327,88],[619,143],[899,610],[649,33],[810,219],[715,562],[486,162],[686,270],[949,338],[279,3],[468,384],[743,73],[937,910],[729,235],[951,889],[73,67],[827,126],[234,10],[748,489],[610,502],[540,66],[344,313],[400,171],[480,255],[709,264],[984,772],[876,739],[974,293],[579,324],[606,266],[955,797],[559,394],[275,149],[907,397],[442,80],[978,948],[455,73],[982,50],[775,349],[985,627],[512,276],[762,3],[750,582],[586,199],[355,329],[632,419],[468,57],[887,148],[985,212],[958,748],[893,501],[887,170],[481,247],[340,211],[983,549],[960,816],[939,479],[569,295],[467,457],[798,178],[565,457],[380,337],[703,293],[748,375],[88,82],[543,296],[418,268],[778,7],[612,515],[808,800],[170,167],[774,493],[711,344],[792,26],[521,42],[987,873],[804,444],[382,72],[955,480],[470,11],[842,402],[706,627],[890,314],[367,77],[631,298],[531,231],[696,400],[912,49],[639,478],[864,278],[812,348],[940,841],[830,138],[25,17],[821,553],[644,206],[809,33],[557,495],[913,289],[516,349],[733,348],[750,7],[457,200],[946,490],[995,589],[876,23],[881,658],[603,345],[503,348],[161,43],[987,73],[947,207],[571,93],[810,371],[356,296],[734,355],[894,450],[664,491],[792,735],[940,205],[639,552],[580,454],[306,255],[699,113],[400,253],[338,65],[777,655],[974,182],[258,185],[502,202],[105,15],[683,483],[674,373],[425,120],[805,106],[650,84],[487,425],[628,379],[205,42],[575,213],[290,252],[558,56],[295,154],[975,810],[927,236],[407,43],[799,473],[807,802],[832,458],[809,641],[588,499],[984,931],[913,905],[886,542],[444,373],[600,56],[804,145],[690,65],[743,248],[944,538],[985,238],[916,140],[992,33],[201,20],[270,222],[937,875],[644,387],[485,27],[842,807],[397,173],[984,423],[221,52],[484,54],[807,86],[351,15],[603,507],[539,444],[799,125],[969,923],[832,322],[876,332],[786,4],[840,627],[962,215],[52,43],[375,110],[782,0],[818,328],[36,12],[828,584],[716,575],[386,145],[381,75],[769,547],[639,25],[646,176],[747,562],[523,105],[992,212],[981,391],[950,56],[514,209],[959,532],[973,41],[995,806],[198,113],[582,75],[828,470],[881,675],[885,348],[998,756],[453,356],[535,421],[824,275],[88,0],[974,736],[532,274],[777,684],[896,282],[384,142],[111,103],[667,416],[905,25],[859,116],[636,241],[878,875],[439,2],[936,684],[561,377],[894,42],[900,128],[728,426],[557,56],[520,98],[651,548],[640,63],[937,450],[485,102],[644,280],[352,109],[643,353],[879,61],[491,429],[953,261],[642,56],[953,118],[978,629],[661,98],[903,693],[493,71],[586,522],[255,234],[745,27],[861,322],[805,742],[372,136],[647,235],[905,624],[924,544],[947,771],[529,402],[304,196],[631,371],[623,381],[960,260],[864,328],[405,213],[307,131],[518,173],[699,180],[918,359],[862,81],[889,163],[768,354],[730,9],[899,94],[455,33],[555,494],[758,481],[838,92],[779,726],[301,136],[851,624],[562,441],[783,61],[771,271],[763,640],[622,320],[833,135],[367,238],[950,237],[262,80],[961,154],[575,116],[767,304],[288,100],[558,17],[657,9],[624,258],[953,514],[815,510],[361,6],[622,69],[633,497],[982,979],[514,211],[748,529],[854,143],[530,388],[834,663],[868,22],[650,307],[875,226],[650,525],[231,212],[891,663],[759,378],[822,219],[746,340],[678,478],[810,803],[349,31],[881,294],[770,647],[874,301],[811,80],[778,646],[355,195],[500,181],[825,606],[692,358],[901,684],[636,343],[793,500],[594,536],[171,156],[744,676],[671,18],[808,684],[845,574],[670,222],[919,321],[737,27],[615,537],[671,219],[591,351],[851,623],[529,315],[923,542],[425,70],[315,17],[712,641],[831,363],[778,259],[666,445],[923,656],[802,759],[346,267],[332,295],[502,323],[919,332],[470,310],[572,167],[619,197],[650,246],[299,221],[884,148],[329,84],[999,696],[764,372],[525,87],[668,297],[806,475],[575,234],[763,580],[598,258],[319,54],[273,150],[740,666],[381,51],[593,378],[812,89],[854,842],[249,214],[886,733],[971,247],[857,132],[264,99],[593,422],[629,515],[802,246],[931,860],[814,411],[412,51],[329,111],[539,308],[470,302],[413,351],[747,338],[804,780],[925,919],[934,361],[538,281],[872,352],[897,608],[765,725],[754,34],[457,245],[735,602],[995,180],[559,61],[558,550],[896,214],[904,215],[449,217],[545,138],[988,474],[348,185],[957,111],[399,393],[600,492],[487,31],[953,822],[436,126],[614,123],[804,501],[281,224],[937,750],[794,711],[395,169],[180,28],[957,366],[566,282],[588,73],[710,578],[666,259],[585,481],[966,741],[412,41],[587,132],[944,115],[889,484],[251,230],[746,0],[970,40],[966,414],[196,192],[918,102],[720,537],[684,354],[206,69],[396,94],[369,235],[777,503],[454,362],[225,122],[935,408],[798,628],[637,410],[737,320],[777,541],[874,384],[416,341],[700,215],[854,10],[973,869],[776,112],[953,723],[739,699],[272,69],[469,399],[866,293],[821,570],[457,444],[134,78],[945,313],[964,79],[817,525],[827,671],[874,736],[798,86],[740,450],[868,472],[568,161],[478,127],[666,22],[876,651],[620,463],[744,391],[938,336],[866,584],[482,33],[937,307],[910,33],[347,259],[124,68],[529,89],[939,533],[858,56],[575,426],[584,517],[618,274],[954,928],[485,88],[720,678],[825,702],[872,602],[434,23],[115,30],[783,432],[905,891],[415,21],[813,45],[308,218],[337,27],[928,551],[610,277],[567,539],[772,79],[775,660],[759,396],[953,478],[645,608],[633,57],[687,412],[888,792],[114,74],[746,631],[404,245],[817,438],[558,129],[887,81],[234,94],[708,344],[851,812],[419,245],[375,15],[581,516],[865,541],[507,104],[91,74],[262,92],[992,159],[265,239],[860,491],[161,106],[839,269],[943,779],[870,658],[381,153],[590,487],[935,883],[880,697],[676,41],[656,545],[981,450],[727,152],[537,382],[985,470],[490,486],[734,435],[971,524],[401,150],[714,235],[799,702],[300,243],[779,8],[502,22],[717,456],[642,299],[879,522],[700,672],[68,34],[422,282],[658,541],[642,551],[842,820],[210,73],[97,11],[439,68],[858,837],[473,450],[401,334],[800,557],[223,42],[569,93],[730,97],[756,531],[951,395],[300,189],[999,340],[514,57],[964,225],[251,212],[733,552],[681,352],[994,54],[478,353],[754,14],[577,124],[616,450],[611,194],[344,23],[641,214],[128,94],[866,235],[680,149],[961,448],[422,298],[908,577],[963,45],[585,274],[307,205],[554,527],[971,384],[974,652],[858,577],[598,313],[602,503],[341,28],[744,56],[936,825],[774,401],[537,460],[516,468],[303,65],[164,82],[397,394],[746,434],[857,680],[895,287],[253,101],[477,216],[450,363],[611,504],[861,80],[720,31],[215,142],[384,301],[300,219],[237,152],[268,113],[684,681],[573,389],[626,321],[573,78],[921,133],[607,115],[743,346],[885,243],[863,316],[982,56],[194,161],[728,97],[927,486],[608,304],[847,100],[900,796],[776,314],[484,220],[932,123],[778,624],[910,13],[939,344],[577,95],[669,461],[974,422],[246,44],[725,276],[983,220],[712,63],[771,253],[828,478],[710,463],[344,295],[888,176],[827,85],[980,7],[959,954],[431,260],[833,522],[448,246],[681,72],[651,212],[477,126],[498,33],[748,724],[676,559],[728,161],[762,161],[309,187],[416,326],[845,245],[975,696],[766,339],[618,488],[242,117],[590,29],[797,710],[479,212],[470,182],[691,187],[973,662],[900,48],[730,202],[421,281],[131,117],[706,304],[634,284],[868,763],[598,394],[757,478],[668,476],[537,110],[811,23],[735,172],[634,516],[761,271],[869,727],[915,738],[902,213],[844,315],[440,273],[911,480],[882,127],[927,325],[873,618],[694,684],[993,449],[537,423],[672,101],[405,317],[967,199],[721,342],[651,524],[986,514],[981,799],[784,191],[944,107],[656,637],[212,166],[534,457],[753,295],[849,280],[413,381],[896,211],[788,66],[985,84],[873,701],[500,298],[592,573],[847,130],[788,487],[464,196],[845,711],[964,666],[807,37],[486,91],[918,383],[327,282],[843,326],[172,148],[708,454],[293,163],[902,817],[472,423],[316,28],[588,108],[996,358],[818,758],[836,192],[396,161],[655,628],[817,176],[802,435],[650,552],[932,236],[172,26],[561,161],[806,416],[946,602],[944,545],[732,291],[884,827],[761,730],[933,72],[939,321],[834,3],[610,82],[337,59],[719,659],[408,243],[765,283],[939,755],[937,312],[382,297],[550,285],[726,228],[641,512],[786,443],[744,282],[374,13],[392,362],[998,923],[910,263],[227,187],[845,29],[985,922],[504,301],[634,407],[707,272],[222,200],[810,63],[525,424],[624,242],[980,119],[765,7],[450,12],[990,461],[510,376],[902,517],[532,277],[921,197],[752,13],[680,413],[558,301],[664,206],[697,109],[719,257],[841,270],[988,118],[698,56],[943,768],[881,349],[956,870],[501,342],[549,0],[763,10],[469,426],[720,212],[491,453],[857,67],[398,102],[686,261],[658,154],[553,140],[467,200],[739,173],[935,890],[631,512],[893,397],[548,407],[632,603],[768,575],[780,325],[486,375],[987,976],[670,531],[296,139],[742,141],[840,388],[983,894],[376,307],[912,316],[652,133],[689,398],[198,184],[636,629],[803,302],[295,32],[782,247],[510,275],[584,77],[421,373],[774,394],[633,286],[690,325],[881,14],[467,123],[973,842],[857,102],[923,577],[765,667],[665,520],[741,196],[702,480],[867,389],[200,45],[415,374],[968,590],[810,524],[933,894],[537,529],[954,322],[530,71],[495,139],[719,232],[847,407],[542,185],[576,533],[686,537],[740,108],[726,710],[222,35],[995,133],[751,205],[418,401],[939,29],[675,18],[638,602],[190,96],[791,272],[783,211],[506,130],[472,111],[770,734],[519,432],[654,218],[689,485],[960,798],[748,293],[345,237],[712,522],[157,138],[799,576],[750,300],[373,192],[966,97],[345,186],[709,449],[532,146],[705,229],[815,479],[636,56],[110,109],[557,68],[287,18],[760,32],[984,369],[882,673],[744,449],[406,97],[386,187],[963,404],[419,332],[181,77],[244,112],[785,0],[513,435],[874,656],[515,452],[688,109],[934,869],[776,551],[594,191],[549,125],[718,658],[839,831],[847,248],[280,127],[488,224],[996,100],[735,473],[568,220],[859,710],[465,112],[791,551],[937,871],[925,466],[576,43],[660,642],[772,624],[529,440],[674,152],[442,26],[222,187],[807,152],[267,135],[999,18],[939,6],[167,76],[789,291],[819,337],[998,73],[811,26],[913,897],[538,517],[960,244],[915,83],[867,302],[701,530],[877,559],[868,858],[986,202],[644,575],[381,29],[959,822],[597,446],[813,108],[827,351],[481,292],[755,383],[436,143],[340,226],[752,163],[943,460],[401,30],[268,80],[947,252],[527,479],[961,433],[656,473],[748,133],[352,193],[864,370],[806,559],[484,119],[854,796],[934,287],[988,219],[719,636],[270,58],[730,115],[349,214],[359,17],[803,734],[870,96],[789,703],[906,894],[542,158],[616,504],[780,46],[990,704],[307,43],[539,161],[493,74],[926,344],[879,109],[737,285],[514,493],[523,22],[862,602],[854,333],[566,55],[414,253],[186,45],[546,124],[239,85],[979,875],[267,170],[892,90],[408,92],[794,160],[839,307],[541,372],[529,331],[406,261],[547,372],[984,955],[530,310],[619,550],[823,75],[984,607],[463,313],[723,609],[676,624],[388,2],[365,296],[546,57],[590,235],[710,690],[985,860],[424,40],[487,169],[798,288],[595,31],[569,150],[157,17],[464,378],[210,94],[634,60],[648,107],[389,146],[819,140],[601,439],[970,515],[812,51],[984,829],[732,245],[539,394],[744,429],[691,20],[741,31],[953,482],[865,414],[570,426],[971,772],[693,274],[374,344],[317,117],[311,270],[919,457],[830,638],[226,162],[862,748],[938,696],[244,242],[774,85],[535,277],[630,334],[585,537],[959,801],[838,567],[781,594],[199,129],[968,234],[245,6],[471,460],[465,337],[870,686],[780,465],[808,552],[516,99],[831,365],[653,257],[480,40],[725,369],[982,99],[831,87],[918,279],[875,561],[541,26],[648,571],[971,706],[853,507],[863,157],[230,139],[732,29],[318,34],[936,661],[990,312],[58,56],[495,5],[786,664],[858,30],[546,236],[949,865],[913,898],[956,208],[495,167],[232,51],[493,73],[661,193],[315,107],[997,271],[947,588],[863,633],[20,17],[610,362],[781,537],[799,262],[279,5],[307,36],[975,592],[266,166],[873,243],[853,837],[911,760],[538,358],[774,290],[917,29],[823,185],[573,231],[358,187],[610,134],[905,462],[928,525],[870,344],[896,767],[953,150],[912,384],[546,490],[929,427],[331,59],[685,325],[581,399],[870,518],[626,463],[419,241],[258,223],[557,547],[983,817],[843,607],[534,359],[525,10],[824,302],[708,484],[429,9],[487,41],[661,453],[942,448],[913,880],[611,458],[626,546],[595,208],[829,333],[993,615],[139,83],[622,50],[961,917],[557,430],[320,212],[988,741],[503,26],[863,580],[521,276],[986,97],[897,274],[946,424],[810,517],[666,203],[943,190],[624,168],[668,543],[711,409],[410,389],[857,450],[568,292],[654,515],[815,88],[843,534],[446,125],[549,369],[257,49],[834,511],[421,197],[458,414],[423,203],[275,129],[974,685],[260,127],[939,540],[922,894],[372,295],[436,346],[967,53],[918,253],[770,479],[454,30],[275,138],[330,166],[847,342],[292,119],[700,226],[722,555],[86,8],[932,482],[640,328],[925,336],[863,663],[592,191],[942,487],[464,395],[738,413],[858,153],[937,433],[720,664],[874,351],[228,131],[682,189],[752,625],[729,95],[944,105],[118,9],[405,265],[922,359],[706,202],[625,268],[851,409],[691,54],[881,243],[996,452],[943,585],[718,614],[231,85],[950,419],[458,194],[927,538],[976,316],[613,247],[311,27],[491,73],[495,369],[911,3],[735,415],[517,153],[735,193],[851,556],[727,15],[719,81],[609,488],[444,370],[293,292],[640,555],[636,11],[967,939],[769,724],[135,31],[870,364],[762,154],[741,672],[866,288],[899,705],[874,333],[103,37],[490,51],[749,334],[503,389],[331,187],[874,82],[577,191],[488,415],[784,673],[314,87],[245,125],[951,517],[697,662],[766,350],[956,654],[788,407],[512,29],[692,339],[726,249],[991,621],[692,3],[744,536],[832,416],[883,257],[763,637],[644,425],[787,701],[888,225],[939,333],[865,178],[982,668],[948,41],[562,469],[395,37],[669,29],[782,558],[627,396],[354,9],[253,3],[532,292],[865,432],[212,18],[775,270],[628,111],[929,903],[668,39],[439,329],[380,87],[948,188],[372,267],[525,279],[727,3],[966,483],[814,753],[625,566],[826,699],[856,237],[572,101],[416,240],[617,204],[767,616],[878,168],[564,334],[729,563],[787,378],[787,781],[913,294],[121,79],[711,708],[830,628],[887,181],[784,299],[903,54],[916,595],[278,192],[449,144],[675,469],[919,95],[438,398],[265,263],[442,10],[724,647],[456,389],[901,325],[926,59],[113,2],[282,200],[534,0],[459,88],[903,383],[774,701],[786,293],[741,317],[658,456],[968,59],[705,196],[818,453],[496,177],[872,221],[848,144],[889,473],[937,241],[475,27],[870,534],[828,89],[874,308],[732,198],[443,88],[300,287],[646,490],[842,289],[609,33],[870,259],[813,496],[949,74],[726,481],[955,26],[995,612],[674,633],[691,424],[460,179],[812,705],[886,40],[851,574],[558,557],[488,152],[736,606],[420,38],[365,362],[857,593],[845,127],[340,228],[445,69],[463,402],[277,233],[907,512],[585,444],[521,492],[458,154],[660,538],[922,633],[951,697],[640,332],[264,258],[703,504],[936,632],[730,92],[990,324],[883,842],[882,476],[925,231],[384,79],[697,665],[625,294],[734,297],[479,228],[937,698],[931,286],[447,51],[774,208],[484,426],[739,129],[200,38],[467,179],[474,79],[714,18],[592,428],[690,192],[975,387],[685,563],[948,517],[477,72],[388,165],[857,827],[644,534],[705,113],[579,191],[841,837],[585,452],[912,792],[741,382],[445,362],[657,565],[367,244],[280,229],[849,423],[949,154],[229,40],[742,341],[785,520],[204,140],[841,385],[144,133],[987,788],[801,775],[161,93],[908,899],[671,626],[675,543],[514,248],[969,482],[933,318],[792,299],[395,354],[734,547],[904,367],[924,144],[967,901],[921,625],[760,589],[980,593],[473,102],[483,251],[864,473],[949,505],[927,472],[508,153],[896,411],[751,293],[807,271],[613,496],[822,118],[322,215],[576,251],[511,184],[668,455],[599,110],[777,580],[722,83],[954,842],[289,220],[881,448],[575,226],[868,178],[929,744],[603,506],[712,677],[929,245],[271,17],[523,192],[965,36],[334,171],[259,252],[968,91],[886,649],[904,235],[872,372],[785,371],[326,102],[530,437],[258,208],[522,97],[763,520],[294,17],[873,262],[781,462],[517,460],[852,487],[163,37],[745,616],[658,78],[915,55],[963,85],[688,330],[243,177],[826,134],[938,631],[826,601],[555,34],[969,25],[380,177],[594,368],[952,592],[639,285],[940,821],[365,211],[906,709],[975,296],[608,57],[956,620],[31,15],[623,407],[993,207],[889,110],[907,104],[954,910],[996,92],[543,488],[677,656],[795,516],[739,169],[871,731],[694,118],[874,697],[742,552],[973,367],[851,539],[691,521],[761,189],[706,67],[585,476],[557,416],[928,777],[509,198],[692,626],[534,114],[819,221],[693,680],[171,15],[799,496],[204,20],[708,442],[677,12],[477,350],[455,382],[760,198],[494,427],[866,806],[662,548],[357,266],[737,675],[315,207],[829,736],[688,43],[803,247],[800,10],[659,268],[271,46],[686,96],[529,209],[595,589],[746,342],[786,488],[404,191],[369,200],[777,8],[934,280],[196,134],[646,50],[917,162],[207,119],[765,254],[861,145],[722,493],[846,184],[348,166],[880,832],[980,150],[966,568],[997,482],[407,22],[682,320],[484,173],[533,95],[913,283],[957,650],[489,459],[909,189],[578,420],[593,90],[844,530],[638,533],[175,70],[570,483],[790,521],[536,145],[526,38],[936,532],[841,353],[259,25],[832,25],[875,635],[662,32],[377,209],[568,228],[989,526],[855,703],[512,61],[688,417],[832,268],[404,115],[748,289],[941,660],[556,154],[387,280],[774,712],[549,471],[235,50],[841,689],[688,127],[191,17],[578,351],[933,734],[750,11],[612,283],[418,302],[790,89],[464,228],[295,183],[873,9],[991,849],[538,487],[359,242],[769,296],[924,134],[764,239],[293,7],[957,658],[959,348],[285,274],[129,126],[989,571],[933,586],[667,54],[823,492],[745,593],[674,639],[310,237],[984,335],[540,371],[760,487],[934,729],[908,455],[449,424],[56,27],[310,230],[363,315],[802,772],[952,99],[860,276],[899,13],[304,265],[640,267],[999,54],[896,537],[879,214],[236,147],[621,471],[923,315],[817,163],[807,343],[404,331],[614,301],[992,463],[526,203],[587,254],[791,347],[433,389],[765,343],[855,318],[640,635],[309,100],[987,457],[328,35],[938,184],[436,431],[596,360],[984,441],[515,392],[610,159],[408,87],[650,633],[806,683],[878,409],[935,162],[946,837],[441,240],[835,599],[527,319],[685,214],[380,34],[668,618],[591,156],[714,302],[892,95],[669,328],[896,488],[509,223],[770,362],[575,406],[312,8],[846,457],[343,319],[900,500],[840,152],[895,690],[531,427],[563,188],[285,213],[662,50],[607,23],[863,455],[723,51],[819,608],[814,450],[689,587],[603,264],[601,39],[980,674],[27,12],[393,243],[476,418],[751,336],[364,57],[541,157],[985,471],[280,75],[495,488],[777,676],[927,392],[738,377],[719,452],[544,5],[918,345],[888,295],[978,814],[410,27],[375,317],[513,69],[740,79],[669,193],[998,436],[676,574],[887,394],[973,372],[733,648],[995,650],[688,113],[415,225],[770,176],[688,551],[932,161],[728,441],[954,343],[169,12],[741,343],[606,197],[844,615],[182,77],[240,180],[669,168],[986,330],[675,83],[749,614],[729,454],[662,312],[528,246],[969,587],[995,42],[642,11],[946,756],[742,261],[511,30],[988,203],[465,328],[963,892],[617,207],[324,178],[686,408],[992,352],[662,493],[372,161],[535,210],[680,475],[282,236],[917,508],[703,378],[688,383],[862,204],[912,125],[653,555],[875,629],[509,99],[313,169],[781,29],[404,342],[896,155],[958,25],[552,208],[589,342],[489,401],[140,124],[944,307],[640,313],[273,192],[371,160],[600,184],[508,279],[639,336],[705,204],[905,777],[819,401],[770,279],[354,268],[325,46],[922,153],[629,157],[995,889],[747,308],[784,745],[934,878],[566,423],[970,659],[704,508],[803,55],[723,278],[341,44],[498,495],[335,198],[618,297],[980,208],[901,535],[493,27],[866,373],[763,143],[352,66],[701,633],[984,178],[692,0],[702,62],[247,87],[150,70],[878,176],[445,176],[739,687],[973,432],[891,489],[581,224],[126,27],[596,82],[697,150],[954,777],[182,18],[457,252],[735,438],[350,25],[350,210],[904,494],[570,145],[900,76],[785,262],[473,262],[621,411],[545,396],[250,100],[949,198],[668,109],[939,487],[355,93],[965,620],[879,103],[808,473],[517,123],[564,437],[854,815],[724,599],[914,57],[974,330],[730,601],[965,822],[736,539],[331,3],[707,79],[433,218],[981,652],[225,175],[618,7],[843,602],[77,74],[221,108],[489,172],[243,26],[949,274],[962,774],[929,140],[529,40],[604,2],[798,784],[539,363],[795,785],[801,278],[145,83],[911,674],[795,286],[405,146],[475,336],[940,306],[648,363],[613,425],[256,37],[600,345],[989,222],[566,106],[699,86],[827,422],[509,327],[154,40],[259,191],[872,211],[508,106],[947,701],[514,371],[858,440],[194,56],[996,814],[473,253],[669,441],[990,439],[985,974],[497,332],[483,38],[817,67],[870,85],[904,26],[608,316],[649,347],[890,573],[782,418],[705,254],[846,419],[748,321],[900,362],[887,397],[558,195],[361,127],[740,313],[760,356],[958,869],[496,228],[301,222],[721,410],[777,169],[653,567],[988,196],[909,327],[649,106],[193,144],[903,151],[680,478],[517,310],[311,189],[637,452],[570,236],[585,29],[829,272],[558,385],[531,88],[546,4],[721,262],[639,500],[858,833],[852,592],[708,175],[725,633],[973,57],[724,421],[477,178],[888,112],[886,693],[737,484],[399,386],[508,237],[934,852],[830,190],[663,430],[953,274],[571,50],[273,242],[730,384],[507,478],[993,374],[939,531],[981,405],[836,585],[143,131],[292,159],[769,400],[274,6],[890,832],[38,15],[930,3],[809,357],[426,277],[995,548],[362,117],[908,335],[847,300],[391,385],[792,716],[334,48],[641,579],[751,256],[721,480],[785,212],[352,319],[412,260],[830,369],[683,446],[115,10],[698,401],[549,171],[920,31],[826,516],[907,465],[915,609],[863,197],[451,425],[598,558],[893,300],[650,323],[932,384],[912,477],[336,142],[756,672],[225,62],[418,76],[958,722],[618,432],[763,410],[943,739],[579,21],[801,426],[944,565],[972,85],[586,265],[787,170],[996,264],[862,12],[941,707],[869,208],[570,159],[774,723],[408,249],[405,103],[633,341],[814,193],[604,214],[490,21],[892,399],[806,135],[775,351],[536,47],[555,254],[834,827],[609,27],[769,364],[925,146],[635,191],[298,29],[201,68],[443,168],[680,133],[358,266],[555,222],[91,25],[979,128],[835,224],[746,43],[959,133],[149,88],[824,106],[874,425],[869,160],[420,311],[534,52],[740,632],[615,424],[753,113],[841,430],[794,503],[756,556],[760,349],[884,56],[347,132],[276,141],[651,286],[508,333],[642,231],[926,429],[840,268],[746,741],[723,307],[576,518],[373,224],[398,235],[919,454],[417,42],[976,819],[644,577],[939,893],[705,510],[327,245],[266,29],[738,637],[919,423],[674,342],[857,624],[729,537],[697,273],[453,193],[856,477],[681,521],[666,20],[921,666],[960,197],[731,578],[588,426],[937,67],[870,145],[584,413],[190,116],[250,88],[980,95],[591,368],[589,425],[485,67],[663,114],[467,30],[753,351],[671,232],[800,362],[310,304],[522,98],[951,614],[750,435],[304,127],[652,434],[532,276],[954,700],[703,224],[990,112],[656,512],[757,307],[872,179],[713,621],[607,79],[187,13],[309,148],[379,286],[787,324],[875,94],[812,296],[676,649],[912,468],[623,165],[481,391],[384,376],[484,427],[377,189],[375,36],[999,757],[563,507],[743,392],[992,643],[491,222],[603,208],[637,398],[176,72],[177,173],[516,417],[866,2],[998,757],[721,617],[992,532],[934,396],[780,60],[847,95],[960,357],[698,692],[580,494],[415,13],[512,318],[821,798],[368,302],[624,526],[377,68],[322,91],[763,314],[835,687],[520,88],[759,42],[885,402],[489,428],[256,213],[811,30],[854,654],[390,334],[515,484],[726,158],[764,37],[982,809],[488,149],[830,487],[901,441],[945,526],[399,24],[993,460],[829,566],[787,778],[849,146],[716,520],[296,119],[974,355],[840,734],[976,73],[757,235],[462,139],[898,434],[299,262],[328,194],[859,380],[914,81],[851,28],[827,195],[782,21],[235,222],[418,236],[436,94],[362,90],[902,240],[791,651],[264,48],[709,186],[569,97],[628,401],[531,318],[595,316],[393,389],[872,40],[868,473],[554,240],[784,233],[525,84],[983,652],[558,504],[680,28],[739,160],[961,167],[637,404],[991,442],[813,475],[247,105],[827,727],[870,455],[212,201],[766,347],[589,51],[568,434],[274,93],[488,400],[746,711],[974,107],[723,586],[572,50],[595,393],[930,434],[719,373],[226,94],[851,531],[909,890],[880,733],[783,67],[882,543],[775,255],[674,252],[769,289],[526,331],[418,96],[841,765],[363,32],[712,292],[676,99],[879,375],[557,379],[568,153],[370,212],[728,609],[934,598],[720,669],[428,1],[480,316],[524,5],[563,501],[864,242],[880,261],[960,681],[810,251],[836,802],[374,357],[602,279],[245,127],[232,46],[431,95],[858,409],[457,78],[991,720],[844,183],[166,53],[639,441],[365,344],[938,711],[747,423],[648,188],[652,636],[739,690],[948,441],[677,63],[872,39],[437,225],[572,241],[945,609],[772,118],[994,894],[860,753],[911,442],[987,738],[831,566],[606,342],[913,632],[968,521],[981,682],[731,108],[838,333],[387,238],[696,336],[243,168],[954,317],[858,711],[993,660],[967,920],[864,504],[833,344],[701,405],[343,134],[646,281],[546,435],[502,105],[979,173],[668,453],[883,116],[423,201],[483,182],[590,336],[316,114],[944,299],[955,397],[128,40],[576,514],[617,490],[480,432],[758,80],[873,329],[158,33],[431,369],[639,474],[955,139],[752,718],[938,57],[972,826],[982,516],[829,310],[728,651],[628,490],[588,124],[815,448],[865,228],[776,109],[768,511],[921,440],[936,685],[967,335],[512,416],[836,543],[586,61],[685,505],[320,135],[672,430],[688,400],[783,704],[249,227],[258,12],[732,570],[264,178],[590,361],[869,418],[183,103],[407,39],[594,177],[598,337],[734,561],[380,371],[951,501],[302,88],[881,107],[967,174],[413,12],[124,0],[692,673],[539,275],[823,293],[945,761],[971,312],[929,19],[780,682],[909,540],[289,128],[539,439],[994,159],[759,282],[769,474],[971,822],[898,274],[86,60],[810,776],[763,504],[288,38],[997,613],[423,109],[536,32],[710,602],[989,547],[272,142],[565,308],[908,305],[275,235],[409,248],[679,600],[216,157],[550,331],[377,10],[987,514],[607,379],[633,73],[270,140],[699,364],[448,209],[946,17],[855,345],[164,108],[896,657],[656,14],[221,176],[823,800],[919,354],[858,206],[880,567],[235,17],[980,76],[519,296],[614,506],[690,660],[647,433],[720,358],[483,379],[368,339],[425,316],[518,395],[646,396],[717,44],[402,22],[708,177],[889,730],[684,119],[679,221],[759,39],[554,530],[209,26],[293,211],[817,408],[931,765],[231,144],[556,502],[507,203],[732,361],[264,174],[979,37],[820,421],[674,628],[973,258],[787,277],[893,29],[556,436],[723,419],[389,359],[801,125],[747,607],[152,1],[867,139],[235,120],[956,271],[973,330],[386,126],[994,806],[416,141],[717,485],[358,14],[794,720],[581,58],[277,104],[924,628],[913,743],[636,498],[809,668],[919,130],[876,846],[452,419],[365,317],[213,26],[434,304],[298,78],[871,172],[848,217],[163,73],[521,354],[990,500],[894,614],[585,190],[375,366],[557,388],[867,316],[791,587],[612,589],[782,58],[313,302],[815,727],[588,398],[858,374],[246,223],[257,164],[843,465],[543,168],[634,51],[601,571],[841,600],[498,130],[781,414],[792,171],[907,366],[567,47],[542,320],[925,920],[846,826],[757,630],[912,8],[953,908],[994,595],[275,67],[461,136],[434,262],[845,128],[576,124],[963,698],[881,647],[977,594],[969,386],[250,84],[945,4],[937,706],[823,270],[904,130],[460,457],[799,103],[969,946],[228,41],[995,744],[466,238],[858,249],[357,81],[967,654],[735,368],[383,80],[539,494],[669,32],[867,201],[544,137],[617,470],[967,270],[591,321],[495,128],[741,282],[566,412],[948,675],[896,595],[927,44],[531,497],[309,260],[955,94],[374,45],[217,95],[601,278],[578,370],[433,353],[704,558],[462,138],[522,424],[685,222],[238,157],[825,232],[390,152],[474,84],[975,259],[540,164],[991,199],[473,104],[637,244],[576,107],[789,165],[731,688],[568,86],[968,510],[989,426],[673,287],[857,504],[891,381],[670,552],[485,11],[614,255],[870,275],[977,701],[823,731],[702,493],[482,338],[942,933],[669,349],[170,70],[227,160],[981,778],[279,42],[833,497],[908,125],[915,454],[605,305],[877,490],[663,422],[737,502],[482,309],[750,537],[249,179],[558,266],[585,64],[839,642],[733,632],[803,540],[904,440],[601,339],[836,171],[984,377],[687,645],[880,316],[950,852],[351,61],[710,192],[851,11],[690,435],[807,468],[494,4],[37,29],[861,430],[655,26],[543,364],[871,502],[885,601],[365,181],[941,104],[637,295],[52,13],[910,795],[920,452],[717,4],[832,117],[810,460],[292,111],[334,95],[883,790],[392,132],[866,811],[392,39],[336,154],[856,378],[461,125],[457,8],[522,1],[865,67],[961,545],[617,150],[740,270],[895,393],[497,10],[819,381],[651,77],[638,338],[622,368],[726,719],[193,10],[682,258],[813,697],[436,325],[876,229],[959,190],[680,54],[863,4],[409,198],[887,409],[553,373],[771,0],[814,573],[536,388],[961,924],[532,510],[951,579],[426,193],[867,725],[397,141],[113,80],[971,373],[873,284],[647,557],[930,856],[614,439],[321,55],[699,391],[524,189],[859,200],[884,272],[873,366],[654,457],[725,664],[440,23],[324,201],[594,418],[860,400],[905,247],[616,460],[335,40],[629,474],[717,348],[349,290],[622,615],[974,288],[286,153],[902,401],[164,48],[815,768],[21,7],[901,311],[217,113],[238,144],[918,357],[603,76],[969,539],[888,99],[834,42],[917,483],[71,24],[66,24],[647,291],[625,288],[579,62],[789,178],[742,674],[649,234],[933,838],[573,284],[257,67],[885,98],[951,842],[420,374],[271,251],[773,657],[99,97],[963,257],[730,335],[871,79],[859,591],[769,647],[359,322],[900,255],[875,560],[779,73],[301,288],[563,135],[987,321],[727,209],[886,685],[498,369],[921,603],[996,554],[760,731],[983,286],[629,507],[946,903],[931,809],[478,470],[724,26],[804,41],[169,7],[550,498],[520,504],[499,35],[884,715],[306,221],[324,141],[81,20],[853,409],[694,194],[765,449],[986,634],[776,383],[535,249],[840,477],[525,265],[594,30],[558,353],[566,51],[601,271],[493,405],[913,785],[821,372],[753,568],[709,87],[704,461],[361,162],[170,163],[606,327],[745,121],[239,23],[981,22],[846,111],[955,605],[712,309],[882,669],[874,692],[611,126],[468,407],[974,463],[575,11],[483,273],[316,282],[834,400],[733,562],[418,189],[906,226],[704,597],[985,467],[686,134],[331,252],[834,780],[874,626],[259,140],[977,134],[382,285],[385,125],[926,661],[937,749],[350,92],[362,247],[161,75],[812,214],[944,572],[369,24],[837,110],[497,53],[688,110],[758,612],[658,8],[286,222],[909,563],[603,403],[632,183],[695,124],[504,101],[919,540],[943,657],[841,119],[629,21],[554,269],[351,312],[880,360],[720,282],[505,324],[717,414],[194,110],[486,353],[463,449],[668,102],[380,15],[138,6],[754,163],[905,533],[801,239],[276,220],[576,133],[548,331],[412,384],[899,640],[788,557],[772,68],[486,293],[382,304],[446,106],[790,699],[971,244],[823,236],[690,70],[938,779],[781,471],[792,160],[645,449],[509,343],[634,359],[866,721],[330,34],[919,910],[762,514],[975,860],[342,101],[886,190],[272,149],[779,673],[470,89],[953,143],[526,58],[685,294],[695,642],[803,545],[691,671],[974,93],[998,97],[560,397],[501,97],[339,264],[708,326],[888,220],[547,171],[644,259],[855,406],[968,677],[701,644],[278,233],[130,14],[874,247],[574,171],[634,520],[956,258],[350,155],[616,264],[286,212],[538,57],[486,344],[871,770],[818,729],[295,64],[874,235],[754,21],[895,461],[912,473],[527,22],[637,462],[439,67],[846,481],[783,383],[271,219],[920,696],[703,448],[952,768],[797,208],[409,27],[993,746],[844,26],[631,441],[756,397],[943,116],[729,192],[142,99],[168,109],[569,34],[784,49],[542,295],[347,70],[705,153],[250,94],[917,324],[490,153],[699,529],[621,302],[923,309],[958,138],[905,778],[991,512],[564,466],[332,68],[480,158],[805,547],[998,236],[874,241],[786,550],[898,843],[946,596],[420,149],[789,140],[505,384],[920,197],[797,530],[860,67],[924,874],[613,348],[620,125],[608,365],[984,190],[623,612],[859,722],[932,388],[465,416],[794,307],[527,313],[216,78],[573,460],[685,410],[277,132],[629,246],[839,784],[119,67],[804,177],[707,58],[844,298],[311,148],[116,34],[878,385],[794,140],[909,97],[167,157],[883,648],[887,567],[472,34],[302,0],[400,197],[362,282],[835,249],[263,11],[730,557],[459,265],[673,444],[651,538],[806,199],[565,520],[499,176],[913,654],[272,179],[797,747],[342,27],[698,334],[882,364],[919,893],[432,381],[702,516],[768,150],[824,1],[901,658],[521,15],[684,483],[905,440],[458,322],[396,72],[746,259],[735,437],[984,88],[543,11],[810,83],[904,320],[463,384],[729,46],[293,172],[463,428],[911,678],[770,539],[947,251],[807,799],[796,497],[826,202],[739,105],[648,365],[441,238],[855,169],[633,179],[841,528],[702,315],[388,197],[775,9],[685,435],[997,583],[458,452],[717,137],[946,33],[879,130],[638,128],[159,7],[881,764],[493,91],[780,415],[482,85],[661,411],[997,709],[988,280],[299,162],[870,458],[766,161],[806,774],[713,111],[852,482],[992,110],[879,713],[960,476],[468,102],[607,603],[284,271],[814,158],[344,276],[903,14],[456,416],[400,382],[878,74],[866,27],[832,272],[728,249],[905,464],[922,279],[204,56],[878,10],[756,60],[940,922],[545,355],[869,756],[330,35],[774,255],[815,477],[229,159],[829,613],[256,61],[796,34],[990,898],[441,163],[939,536],[890,203],[626,237],[893,169],[879,540],[880,238],[775,506],[816,534],[519,450],[648,576],[743,333],[523,332],[349,40],[802,194],[529,86],[693,637],[328,112],[817,32],[688,486],[873,162],[899,243],[749,513],[658,44],[537,536],[254,226],[966,668],[883,395],[579,557],[935,789],[723,134],[855,700],[711,62],[620,272],[702,166],[563,196],[610,24],[268,51],[428,320],[327,36],[667,450],[307,145],[809,53],[628,569],[800,379],[722,6],[846,791],[714,708],[838,39],[639,296],[984,727],[796,722],[886,788],[590,555],[650,469],[902,717],[207,5],[234,135],[918,585],[98,6],[687,381],[866,575],[484,332],[315,199],[404,313],[150,5],[734,585],[665,439],[818,128],[915,909],[792,782],[700,479],[958,697],[729,597],[732,671],[953,33],[803,89],[719,412],[773,414],[443,131],[776,311],[616,21],[838,402],[529,20],[292,23],[565,454],[373,31],[703,693],[484,128],[530,518],[570,153],[893,47],[663,71],[223,190],[787,404],[564,81],[189,21],[794,517],[690,112],[603,144],[862,348],[922,865],[706,89],[592,299],[828,687],[533,262],[350,305],[993,920],[852,780],[922,718],[386,146],[792,530],[747,321],[438,133],[995,418],[984,706],[236,139],[873,411],[735,587],[801,487],[849,679],[555,513],[654,536],[99,30],[479,433],[864,232],[959,243],[999,966],[118,19],[660,516],[973,553],[730,565],[820,530],[683,521],[411,284],[682,303],[553,494],[982,427],[858,568],[352,268],[822,492],[173,85],[634,207],[884,270],[342,68],[541,268],[654,443],[510,479],[548,215],[616,475],[877,399],[649,5],[826,128],[771,491],[612,219],[577,498],[641,193],[800,558],[217,117],[438,208],[571,393],[913,755],[452,364],[877,60],[782,185],[481,312],[811,716],[801,57],[757,693],[767,126],[689,160],[488,24],[656,493],[747,208],[676,426],[728,251],[356,349],[287,101],[166,2],[523,54],[184,63],[482,353],[617,327],[671,156],[671,343],[660,204],[707,316],[639,22],[697,166],[625,299],[998,374],[681,467],[905,377],[523,298],[490,108],[465,63],[613,598],[844,100],[808,536],[424,236],[513,491],[449,366],[356,20],[376,192],[737,728],[898,487],[285,117],[427,205],[155,54],[551,313],[994,92],[690,228],[645,588],[303,234],[538,224],[950,321],[940,288],[757,403],[762,10],[672,333],[906,146],[682,146],[468,33],[749,256],[815,256],[969,635],[757,99],[818,57],[269,137],[845,291],[767,272],[593,386],[828,570],[499,443],[876,605],[952,427],[707,254],[832,751],[392,221],[386,221],[309,125],[117,100],[698,105],[395,60],[858,100],[785,479],[213,85],[434,14],[968,354],[506,407],[668,449],[689,128],[518,471],[890,78],[681,362],[841,237],[749,408],[585,358],[721,309],[838,598],[993,418],[775,70],[686,50],[698,388],[967,817],[991,571],[937,148],[969,818],[922,0],[750,8],[543,56],[703,421],[148,113],[800,227],[630,580],[926,839],[658,208],[390,267],[742,124],[849,471],[962,715],[875,439],[868,333],[981,208],[444,14],[764,231],[731,569],[445,303],[643,398],[927,196],[802,676],[834,186],[848,446],[932,15],[964,686],[591,571],[661,320],[382,279],[647,43],[827,208],[287,223],[311,163],[385,339],[685,558],[707,116],[376,94],[835,645],[938,770],[681,18],[687,215],[832,261],[969,13],[330,1],[734,293],[963,549],[713,160],[672,397],[193,15],[492,1],[557,59],[857,661],[778,111],[630,185],[719,24],[963,576],[670,2],[597,421],[421,1],[328,7],[808,649],[554,168],[984,600],[946,188],[518,331],[840,805],[619,242],[828,676],[623,183],[72,40],[447,306],[630,43],[689,498],[851,800],[806,119],[870,237],[604,78],[506,367],[92,89],[872,223],[640,346],[435,322],[471,120],[941,357],[842,430],[725,378],[991,875],[815,198],[322,267],[598,519],[819,301],[830,329],[818,484],[970,639],[986,511],[952,613],[153,81],[224,179],[745,605],[747,488],[373,296],[800,105],[540,114],[743,192],[628,433],[986,334],[667,656],[546,505],[980,976],[555,514],[897,191],[354,238],[509,114],[301,89],[929,134],[194,83],[296,282],[169,120],[891,874],[859,844],[529,185],[426,1],[954,326],[570,458],[611,127],[527,401],[458,362],[362,328],[743,474],[907,691],[898,143],[812,439],[480,193],[809,667],[787,140],[889,804],[774,176],[876,399],[766,596],[939,38],[784,494],[357,163],[924,592],[541,142],[363,173],[490,71],[849,375],[498,285],[889,393],[416,34],[809,354],[801,196],[485,2],[506,202],[659,426],[591,159],[411,60],[441,40],[347,130],[5,1],[615,330],[292,109],[616,278],[145,2],[688,186],[838,245],[242,78],[745,93],[431,39],[970,207],[85,67],[725,371],[886,374],[183,66],[597,232],[686,135],[999,548],[751,724],[619,157],[226,51],[710,469],[416,158],[323,172],[880,774],[468,43],[862,766],[204,52],[361,227],[838,661],[292,200],[579,296],[857,626],[940,646],[548,305],[796,323],[847,501],[795,481],[513,284],[595,516],[843,776],[938,606],[864,670],[111,7],[855,291],[664,369],[695,341],[951,606],[943,195],[496,435],[857,391],[621,443],[793,687],[665,661],[694,465],[760,204],[288,160],[975,230],[486,365],[778,347],[727,638],[649,561],[781,468],[846,628],[240,96],[322,84],[816,781],[298,91],[303,191],[928,632],[825,51],[892,99],[808,720],[965,812],[965,73],[998,413],[715,376],[882,0],[970,854],[563,84],[578,510],[150,118],[523,272],[898,657],[618,244],[479,131],[714,650],[419,377],[800,714],[226,215],[902,781],[838,82],[916,538],[238,113],[395,19],[708,422],[572,105],[673,594],[746,244],[162,88],[864,230],[911,868],[718,94],[891,336],[897,635],[763,511],[520,321],[999,925],[379,302],[741,730],[642,367],[495,319],[557,20],[726,667],[880,742],[662,328],[494,465],[775,160],[577,542],[704,48],[739,35],[139,48],[848,441],[921,85],[637,522],[521,506],[743,589],[928,604],[840,167],[128,39],[854,214],[911,99],[760,595],[527,148],[493,111],[487,302],[820,114],[290,274],[951,227],[623,233],[750,122],[664,449],[653,418],[333,114],[221,89],[993,441],[767,518],[375,243],[551,261],[992,698],[961,68],[418,52],[727,104],[959,171],[875,415],[507,204],[840,561],[815,467],[940,659],[838,505],[679,304],[767,435],[303,12],[654,284],[756,318],[557,85],[443,227],[821,618],[581,47],[866,212],[933,741],[762,249],[720,242],[288,273],[582,498],[514,262],[784,446],[343,327],[867,23],[515,43],[807,142],[615,404],[762,445],[308,6],[839,213],[683,142],[788,750],[599,34],[608,64],[461,382],[990,613],[748,187],[928,360],[687,686],[769,169],[488,19],[941,843],[485,208],[669,363],[971,132],[333,189],[834,733],[809,326],[599,386],[329,130],[482,345],[726,197],[825,20],[42,38],[987,57],[580,139],[664,499],[487,309],[392,166],[985,683],[968,690],[455,45],[291,186],[841,423],[970,348],[772,566],[41,10],[617,228],[816,509],[660,575],[927,682],[762,351],[884,861],[616,577],[678,522],[619,152],[712,546],[561,554],[638,503],[360,22],[248,59],[362,175],[841,783],[193,35],[992,611],[881,401],[952,498],[830,253],[310,166],[959,210],[696,247],[241,178],[653,266],[567,166],[849,382],[404,15],[689,318],[776,361],[911,749],[196,76],[721,50],[549,495],[520,314],[770,18],[861,751],[955,858],[623,258],[965,516],[877,622],[510,194],[619,598],[309,190],[924,587],[883,693],[815,635],[154,113],[498,418],[999,701],[745,281],[828,415],[857,249],[602,166],[847,138],[759,600],[677,74],[950,208],[360,132],[745,689],[718,543],[331,10],[662,24],[996,366],[746,80],[729,143],[717,631],[711,614],[801,558],[913,433],[713,387],[976,215],[957,891],[775,362],[707,507],[903,603],[343,118],[840,456],[650,577],[102,36],[978,627],[587,547],[824,766],[534,377],[953,498],[763,615],[957,80],[736,685],[834,174],[320,131],[829,39],[169,32],[316,45],[888,610],[686,151],[431,56],[395,304],[688,254],[607,520],[921,4],[365,118],[718,438],[975,311],[445,407],[843,476],[539,5],[953,933],[287,34],[930,126],[666,432],[603,240],[643,162],[481,315],[669,105],[400,132],[644,270],[955,92],[739,53],[276,144],[729,725],[454,106],[606,332],[517,175],[809,125],[346,107],[988,533],[629,82],[829,720],[431,146],[903,19],[972,481],[82,73],[484,52],[968,74],[478,459],[735,658],[471,391],[458,382],[886,196],[411,213],[918,330],[748,684],[731,604],[611,96],[239,52],[621,552],[801,87],[946,877],[67,60],[599,14],[928,277],[830,463],[456,182],[690,339],[971,62],[458,34],[880,674],[786,46],[513,249],[855,254],[655,312],[216,145],[959,55],[654,497],[859,616],[985,544],[821,444],[903,449],[255,132],[334,69],[396,232],[373,346],[967,500],[670,295],[719,16],[950,859],[305,51],[536,66],[460,117],[838,57],[946,698],[810,708],[828,378],[544,99],[856,824],[747,233],[948,663],[224,36],[948,229],[760,516],[855,229],[942,209],[598,212],[970,459],[792,419],[384,104],[721,478],[665,609],[938,676],[806,209],[461,396],[478,109],[552,439],[446,73],[477,279],[396,259],[875,743],[991,532],[773,680],[430,395],[950,192],[112,93],[803,213],[997,887],[994,569],[678,288],[295,57],[871,622],[492,11],[542,473],[772,119],[340,41],[107,45],[501,113],[760,179],[891,377],[995,63],[597,531],[717,156],[740,268],[987,32],[512,424],[940,539],[895,96],[925,92],[703,456],[798,700],[527,161],[985,380],[662,196],[824,806],[564,313],[866,257],[846,435],[449,339],[449,360],[459,298],[769,748],[836,776],[740,522],[287,41],[831,447],[350,253],[619,280],[874,558],[263,257],[640,465],[799,430],[966,459],[631,470],[502,25],[749,739],[684,211],[942,789],[715,283],[682,54],[831,755],[936,860],[727,84],[641,326],[904,834],[225,149],[232,117],[538,26],[678,171],[761,115],[583,6],[509,418],[629,128],[835,660],[741,524],[445,281],[678,15],[825,704],[442,42],[838,218],[420,60],[555,243],[185,121],[913,275],[449,18],[672,371],[699,429],[812,515],[868,144],[934,226],[910,848],[952,368],[443,350],[668,23],[712,535],[515,282],[782,262],[862,102],[857,812],[180,73],[959,636],[454,203],[790,365],[935,404],[971,221],[889,378],[837,684],[380,237],[382,70],[934,555],[831,289],[556,171],[624,455],[358,144],[789,275],[786,106],[374,181],[214,31],[991,551],[777,150],[929,318],[890,626],[362,25],[649,27],[955,210],[911,150],[369,137],[738,259],[554,494],[851,774],[361,360],[759,476],[984,376],[469,223],[263,215],[394,7],[286,277],[897,297],[627,235],[873,3],[987,603],[415,220],[497,352],[995,948],[785,38],[502,358],[532,121],[718,44],[538,349],[587,323],[844,196],[537,43],[346,90],[818,79],[409,189],[769,207],[830,217],[676,130],[782,752],[616,241],[445,230],[614,88],[559,293],[871,673],[463,271],[534,109],[468,72],[762,20],[757,740],[760,267],[453,72],[932,348],[727,594],[712,618],[662,561],[946,938],[662,539],[799,291],[994,633],[526,503],[920,46],[473,30],[799,306],[991,360],[769,339],[892,288],[809,68],[722,718],[957,455],[596,37],[838,748],[939,153],[787,699],[862,53],[562,508],[936,344],[421,358],[989,702],[734,185],[822,585],[998,630],[717,583],[845,234],[752,672],[913,543],[452,98],[920,496],[855,514],[879,443],[904,697],[930,332],[469,263],[885,708],[744,634],[398,352],[868,406],[592,106],[517,419],[870,650],[67,37],[140,28],[932,840],[856,385],[372,351],[617,66],[937,762],[637,248],[252,86],[900,114],[951,86],[950,326],[335,152],[508,268],[706,26],[502,456],[670,11],[957,740],[617,291],[947,442],[905,208],[260,181],[866,262],[106,24],[702,220],[242,160],[914,663],[906,254],[381,256],[856,52],[156,17],[397,361],[753,676],[741,552],[988,106],[838,601],[919,437],[805,631],[778,760],[424,412],[882,140],[650,443],[375,200],[759,523],[317,45],[798,351],[579,1],[104,60],[650,644],[997,143],[768,183],[165,151],[747,634],[630,34],[363,61],[269,134],[318,2],[906,346],[605,44],[884,800],[325,161],[337,313],[884,251],[865,610],[737,685],[352,292],[348,143],[663,196],[521,27],[554,432],[177,105],[987,584],[584,498],[743,122],[434,215],[797,468],[744,421],[109,68],[937,282],[506,308],[654,474],[213,208],[671,397],[251,76],[760,501],[417,361],[60,37],[179,75],[718,362],[362,33],[348,83],[873,80],[259,190],[644,418],[208,89],[686,251],[860,587],[218,48],[997,471],[785,504],[920,37],[835,731],[828,684],[808,204],[552,520],[526,0],[736,304],[775,260],[973,942],[812,419],[328,262],[549,127],[813,131],[692,656],[721,620],[926,400],[766,337],[867,626],[945,515],[867,8],[988,413],[785,497],[806,746],[907,405],[529,318],[415,401],[797,591],[727,684],[505,239],[718,141],[301,50],[206,140],[180,127],[677,456],[803,95],[747,666],[653,18],[973,64],[830,360],[938,105],[658,99],[485,445],[505,504],[915,451],[798,486],[978,625],[257,141],[675,65],[843,823],[353,29],[324,130],[853,795],[752,637],[795,347],[886,722],[905,357],[713,593],[318,260],[860,344],[265,87],[153,133],[477,428],[476,208],[202,47],[392,64],[990,78],[500,6],[928,221],[167,160],[427,137],[613,431],[829,375],[930,562],[759,570],[906,31],[396,355],[929,482],[760,81],[731,256],[279,275],[861,10],[971,232],[279,231],[787,559],[783,517],[252,224],[613,29],[197,5],[422,61],[886,150],[773,249],[475,99],[888,740],[735,392],[139,111],[242,138],[813,96],[454,373],[496,50],[259,57],[971,222],[806,543],[756,443],[680,338],[435,347],[287,88],[537,347],[744,51],[923,648],[910,450],[766,449],[665,466],[679,573],[940,222],[704,653],[831,34],[858,52],[927,413],[984,470],[961,932],[863,482],[538,443],[549,374],[477,144],[833,418],[939,853],[945,552],[495,48],[733,489],[574,115],[563,67],[692,163],[373,281],[764,655],[72,41],[337,50],[76,34],[987,441],[918,656],[922,710],[748,641],[540,430],[630,619],[826,411],[766,381],[652,345],[593,141],[912,640],[989,968],[914,797],[714,187],[811,497],[281,81],[551,256],[963,647],[727,628],[972,664],[892,0],[208,184],[822,575],[438,87],[374,254],[651,182],[705,353],[505,216],[873,137],[603,213],[955,606],[536,57],[498,277],[705,243],[766,90],[948,942],[938,194],[685,396],[982,780],[905,51],[388,219],[700,66],[215,118],[248,97],[950,299],[902,585],[812,578],[936,21],[660,513],[634,154],[976,534],[383,130],[980,816],[551,455],[388,280],[522,74],[473,448],[785,56],[783,96],[753,181],[706,497],[683,587],[966,40],[701,304],[417,254],[649,619],[480,369],[723,519],[348,247],[253,212],[366,16],[899,671],[918,457],[771,323],[549,386],[963,47],[865,854],[651,141],[849,487],[844,815],[878,493],[650,499],[793,582],[782,380],[293,13],[794,298],[790,229],[904,838],[385,20],[776,167],[840,704],[290,110],[747,319],[734,392],[350,166],[980,903],[736,236],[429,186],[960,864],[682,169],[568,321],[864,821],[585,448],[766,79],[729,221],[622,596],[650,632],[269,58],[889,689],[908,113],[716,687],[733,263],[796,140],[374,20],[689,420],[975,325],[415,64],[486,462],[775,618],[118,64],[969,668],[664,437],[714,473],[890,748],[318,19],[836,801],[231,70],[682,336],[502,44],[533,168],[677,574],[686,647],[800,164],[881,640],[481,383],[719,315],[865,615],[653,558],[286,145],[682,342],[637,361],[969,703],[541,498],[742,739],[212,89],[560,480],[540,358],[804,578],[818,479],[910,746],[148,95],[856,84],[978,880],[915,777],[267,233],[796,325],[849,106],[783,180],[997,934],[710,224],[645,519],[959,940],[619,512],[869,678],[419,165],[785,47],[786,325],[995,83],[606,376],[592,328],[914,390],[896,329],[157,89],[726,671],[327,114],[895,778],[956,69],[856,313],[618,403],[872,133],[723,119],[789,69],[903,434],[488,270],[515,354],[964,199],[270,14],[100,9],[501,469],[303,32],[761,694],[658,460],[883,564],[635,201],[999,323],[915,614],[53,4],[685,640],[868,457],[218,97],[548,251],[668,475],[949,440],[492,382],[168,112],[897,870],[408,315],[883,812],[746,52],[609,164],[813,87],[818,281],[862,499],[878,702],[348,19],[689,440],[612,364],[820,511],[964,31],[942,769],[384,87],[651,47],[870,752],[532,301],[281,136],[571,310],[763,120],[987,905],[366,152],[768,682],[871,691],[848,335],[748,509],[840,750],[711,202],[265,168],[897,39],[996,236],[582,527],[854,587],[371,130],[592,577],[733,144],[236,144],[613,410],[935,729],[805,621],[967,896],[650,309],[420,303],[966,720],[625,233],[768,372],[186,107],[884,33],[531,440],[911,146],[564,336],[931,852],[861,249],[781,762],[77,30],[856,158],[487,238],[582,488],[890,105],[878,839],[190,37],[692,594],[873,509],[830,724],[874,200],[679,422],[597,589],[905,135],[949,144],[466,213],[81,15],[809,699],[624,347],[757,138],[284,119],[731,650],[243,136],[936,178],[864,591],[479,254],[430,215],[787,561],[605,285],[407,268],[226,116],[671,336],[589,64],[650,579],[714,257],[601,252],[608,71],[905,453],[896,187],[367,3],[348,201],[930,42],[359,306],[744,166],[151,54],[840,139],[479,347],[641,87],[686,215],[784,629],[902,458],[675,92],[264,130],[665,399],[696,513],[912,206],[910,718],[904,359],[48,16],[905,750],[744,135],[600,218],[853,525],[811,181],[876,484],[558,37],[896,200],[902,812],[780,731],[180,91],[816,189],[917,32],[714,541],[886,881],[261,131],[753,658],[944,622],[874,584],[405,152],[930,307],[555,232],[803,588],[533,250],[647,493],[847,28],[112,13],[895,64],[908,656],[614,334],[732,559],[516,460],[971,840],[422,279],[623,209],[459,101],[640,269],[840,519],[918,638],[967,897],[985,50],[914,779],[536,531],[939,837],[902,301],[243,76],[906,154],[874,48],[818,723],[878,213],[992,106],[907,433],[381,261],[815,245],[800,613],[829,813],[939,824],[881,804],[928,222],[729,513],[928,342],[109,26],[393,281],[732,159],[909,463],[88,33],[855,577],[969,493],[680,251],[197,190],[669,96],[895,721],[308,18],[857,79],[631,518],[848,659],[880,793],[581,263],[876,677],[565,488],[603,17],[349,234],[791,558],[793,227],[923,202],[479,99],[917,803],[921,328],[418,115],[684,48],[905,14],[485,172],[200,54],[567,337],[724,62],[702,616],[937,554],[701,302],[998,965],[639,67],[265,202],[863,757],[671,373],[949,155],[224,211],[166,55],[705,664],[460,16],[961,939],[530,67],[927,244],[821,457],[860,193],[953,540],[96,33],[921,108],[102,70],[768,391],[771,475],[978,17],[929,865],[558,351],[923,246],[974,484],[819,439],[989,291],[274,3],[708,190],[588,316],[884,36],[587,277],[847,83],[996,656],[879,339],[988,973],[695,188],[489,76],[810,573],[748,492],[310,36],[887,471],[523,518],[804,258],[127,80],[483,86],[768,558],[706,352],[120,91],[973,744],[685,188],[915,324],[834,151],[516,156],[639,580],[928,195],[734,160],[956,105],[317,312],[547,117],[726,340],[951,251],[748,413],[525,273],[328,248],[878,67],[444,7],[616,251],[493,433],[903,348],[236,116],[393,200],[567,292],[986,296],[513,33],[827,826],[952,664],[673,40],[606,193],[930,254],[232,121],[762,544],[275,202],[760,549],[318,293],[353,3],[925,371],[494,131],[689,502],[739,673],[952,11],[456,444],[818,269],[664,192],[656,492],[708,136],[822,739],[517,154],[425,390],[730,464],[641,515],[466,447],[887,347],[912,452],[615,207],[868,354],[801,285],[908,203],[259,169],[668,395],[883,838],[457,272],[867,851],[821,490],[685,420],[778,427],[220,74],[396,219],[519,241],[741,307],[970,46],[891,6],[683,362],[607,169],[477,251],[973,480],[405,298],[899,477],[367,6],[824,759],[998,176],[534,471],[454,339],[727,25],[484,333],[502,231],[448,252],[668,317],[679,488],[884,431],[229,33],[811,98],[675,464],[711,683],[535,447],[98,73],[782,551],[490,248],[819,12],[556,453],[348,330],[997,890],[816,516],[464,376],[544,155],[511,163],[293,254],[695,316],[533,363],[183,131],[998,962],[452,291],[599,518],[483,359],[229,93],[644,420],[861,819],[914,729],[611,368],[475,365],[852,706],[695,265],[956,110],[734,382],[947,667],[569,311],[993,765],[703,596],[516,39],[755,467],[894,824],[526,368],[686,663],[427,41],[970,691],[679,432],[783,595],[220,22],[217,206],[332,152],[459,206],[973,248],[770,382],[966,754],[658,30],[719,241],[885,358],[417,61],[856,497],[604,128],[734,572],[969,1],[816,372],[496,486],[979,335],[528,48],[860,356],[945,187],[295,152],[992,957],[226,14],[877,229],[946,580],[273,102],[696,2],[672,164],[443,14],[506,487],[554,295],[949,548],[280,279],[262,109],[799,196],[797,477],[788,33],[935,544],[650,247],[758,134],[833,136],[305,288],[507,85],[805,735],[668,371],[738,41],[980,512],[701,391],[166,3],[611,374],[821,605],[867,752],[570,430],[954,124],[598,135],[813,224],[447,10],[701,433],[571,451],[964,936],[961,443],[801,663],[717,710],[569,353],[751,12],[904,125],[534,225],[916,261],[993,8],[894,234],[970,364],[806,368],[961,758],[936,603],[305,259],[215,189],[611,310],[962,561],[956,234],[843,450],[602,231],[428,37],[238,218],[737,106],[737,34],[752,113],[747,512],[242,226],[406,104],[864,126],[589,370],[585,228],[701,93],[299,196],[823,43],[746,269],[277,0],[832,520],[876,577],[893,414],[724,51],[493,178],[909,205],[232,129],[406,151],[661,408],[783,64],[857,483],[802,506],[809,643],[714,344],[867,262],[394,327],[729,682],[982,890],[886,613],[720,45],[845,645],[947,733],[424,320],[650,402],[355,335],[551,339],[882,458],[376,363],[157,33],[262,59],[622,497],[992,545],[955,846],[804,102],[262,79],[822,818],[406,314],[293,268],[855,370],[777,405],[659,234],[576,167],[458,341],[395,377],[961,921],[600,217],[814,619],[929,881],[671,309],[431,365],[683,599],[465,216],[995,544],[727,12],[785,767],[286,80],[726,655],[833,748],[500,312],[508,233],[687,214],[954,307],[905,49],[605,517],[189,10],[921,46],[933,188],[431,223],[676,597],[809,90],[483,179],[374,90],[464,78],[790,157],[908,605],[782,506],[188,165],[764,494],[974,284],[641,237],[898,76],[690,289],[851,395],[247,167],[499,84],[711,258],[732,651],[982,119],[936,637],[846,522],[909,361],[661,392],[164,144],[611,51],[842,700],[966,952],[843,817],[436,121],[165,21],[373,348],[627,435],[363,51],[827,138],[674,625],[302,226],[812,229],[502,74],[897,375],[651,202],[651,193],[616,523],[485,3],[960,155],[976,378],[215,92],[370,87],[846,155],[531,99],[727,284],[414,22],[657,290],[647,154],[330,237],[745,9],[967,573],[862,341],[694,489],[780,117],[868,790],[950,284],[944,137],[469,457],[990,429],[782,758],[776,737],[590,515],[550,3],[836,727],[946,701],[979,275],[655,20],[391,220],[804,612],[834,708],[372,29],[870,595],[689,622],[318,161],[950,746],[547,11],[599,578],[943,412],[421,128],[727,671],[398,318],[889,80],[638,212],[398,16],[931,71],[622,397],[900,790],[852,192],[960,148],[550,76],[678,419],[296,170],[819,276],[716,93],[889,194],[420,151],[859,759],[459,421],[619,191],[756,87],[820,576],[763,701],[530,282],[470,119],[796,674],[635,629],[482,141],[902,678],[713,518],[793,26],[330,235],[335,37],[941,510],[902,50],[789,264],[728,150],[242,201],[724,522],[570,463],[826,225],[861,571],[605,491],[677,125],[737,324],[507,353],[554,191],[882,298],[980,630],[549,123],[809,733],[841,840],[831,821],[827,588],[261,68],[544,528],[882,677],[829,815],[762,666],[878,847],[507,80],[453,76],[200,7],[617,579],[336,236],[992,66],[356,246],[950,665],[470,227],[310,28],[678,300],[858,412],[390,69],[776,213],[705,278],[469,298],[282,184],[526,345],[940,258],[767,418],[881,589],[577,85],[647,527],[565,223],[627,350],[297,85],[637,627],[454,375],[871,712],[828,127],[668,382],[777,22],[527,39],[609,240],[422,74],[894,308],[701,552],[799,740],[844,363],[683,637],[920,396],[367,329],[532,330],[519,370],[741,49],[558,429],[834,459],[742,633],[787,508],[784,349],[628,209],[423,292],[580,386],[489,464],[956,795],[726,129],[961,260],[508,227],[852,265],[972,324],[800,748],[973,8],[783,381],[851,573],[340,146],[781,440],[228,58],[220,38],[214,209],[511,140],[356,215],[936,25],[833,514],[759,551],[249,160],[837,29],[208,83],[939,509],[869,349],[626,563],[375,16],[948,306],[183,176],[245,44],[832,168],[764,31],[922,280],[403,287],[931,382],[587,297],[709,442],[695,31],[806,477],[793,385],[987,30],[536,340],[762,254],[395,352],[858,364],[799,393],[258,139],[991,200],[211,192],[453,331],[315,117],[862,772],[483,177],[766,420],[362,231],[697,110],[823,704],[949,476],[759,102],[287,20],[940,299],[386,301],[324,217],[528,376],[927,418],[894,766],[724,308],[682,510],[929,111],[847,666],[897,884],[981,959],[540,290],[337,118],[746,86],[706,324],[358,131],[961,840],[337,60],[877,12],[536,346],[929,226],[283,205],[585,66],[986,554],[967,317],[984,302],[859,25],[965,895],[574,300],[720,132],[287,208],[474,69],[801,51],[220,156],[351,2],[233,227],[274,108],[892,98],[955,526],[568,213],[836,746],[824,68],[763,24],[191,33],[629,69],[940,239],[825,71],[766,348],[758,714],[820,466],[232,85],[410,31],[83,68],[502,466],[890,195],[512,35],[459,170],[693,124],[527,335],[824,25],[975,525],[526,335],[732,415],[936,184],[747,86],[973,412],[249,220],[931,373],[482,464],[840,383],[154,46],[770,687],[592,343],[779,293],[562,30],[579,455],[716,399],[929,533],[929,729],[688,664],[421,210],[109,12],[569,487],[868,520],[908,673],[393,289],[459,243],[399,139],[210,83],[890,571],[838,590],[965,691],[734,509],[677,299],[768,206],[677,544],[955,915],[568,109],[571,438],[248,208],[273,263],[942,588],[519,98],[535,125],[334,290],[280,248],[418,341],[535,261],[814,57],[298,8],[821,303],[985,270],[473,34],[737,472],[679,615],[584,277],[251,88],[974,568],[669,396],[916,77],[581,407],[840,619],[602,176],[841,523],[899,813],[867,159],[910,412],[347,17],[871,157],[699,486],[897,432],[853,812],[809,541],[409,287],[765,219],[204,92],[681,218],[353,83],[907,54],[751,666],[965,363],[972,615],[311,259],[372,68],[926,324],[117,93],[348,116],[908,53],[725,187],[790,764],[161,109],[691,465],[724,396],[635,166],[420,290],[462,390],[237,151],[466,357],[532,439],[647,353],[319,198],[859,638],[815,599],[946,114],[185,156],[444,439],[879,498],[389,317],[501,272],[885,67],[710,536],[782,145],[933,25],[740,464],[883,715],[989,817],[765,630],[649,16],[356,110],[421,6],[728,36],[716,519],[404,123],[827,278],[869,252],[698,274],[811,462],[504,359],[866,836],[684,87],[918,434],[426,59],[454,230],[499,218],[518,378],[714,261],[963,324],[723,250],[546,149],[39,5],[849,586],[774,324],[420,228],[954,915],[963,368],[940,932],[886,292],[253,12],[423,47],[930,517],[480,25],[605,593],[816,184],[704,142],[934,718],[981,289],[638,209],[688,437],[757,254],[326,70],[884,9],[802,209],[823,66],[796,72],[204,35],[333,11],[885,126],[461,244],[571,497],[64,45],[351,222],[621,519],[638,464],[632,119],[452,40],[334,22],[490,439],[922,187],[665,592],[620,251],[849,304],[627,238],[930,671],[753,208],[767,285],[679,374],[421,283],[483,66],[515,186],[886,270],[371,278],[900,499],[947,730],[267,149],[717,568],[814,182],[811,646],[659,240],[726,203],[336,102],[738,218],[753,350],[371,253],[893,133],[275,250],[720,533],[866,229],[914,544],[378,87],[486,274],[999,607],[426,254],[334,205],[674,109],[830,439],[694,104],[592,100],[305,120],[610,387],[683,19],[543,161],[739,289],[459,19],[724,377],[834,405],[377,198],[752,337],[836,780],[730,20],[858,161],[655,254],[972,20],[312,104],[551,528],[924,348],[496,340],[893,204],[613,356],[546,279],[999,125],[569,69],[300,106],[69,10],[376,279],[523,452],[156,36],[981,309],[241,95],[585,354],[730,297],[740,514],[992,24],[701,205],[404,219],[746,205],[532,519],[637,402],[679,624],[752,705],[575,364],[738,335],[149,105],[603,542],[507,194],[518,317],[200,92],[799,667],[964,122],[476,6],[523,151],[631,438],[612,54],[536,71],[738,9],[825,405],[986,15],[912,743],[767,148],[848,629],[584,339],[728,677],[823,53],[620,78],[515,455],[781,546],[466,203],[975,306],[982,488],[899,210],[887,251],[719,69],[907,629],[740,508],[582,27],[521,495],[983,683],[377,47],[738,37],[805,93],[573,135],[577,307],[867,501],[332,84],[878,579],[971,129],[394,195],[590,85],[400,329],[787,213],[255,59],[174,1],[952,135],[967,730],[894,625],[803,444],[600,295],[531,328],[906,465],[929,218],[969,799],[555,0],[887,784],[595,544],[911,531],[829,274],[697,220],[976,19],[654,440],[497,127],[995,695],[750,682],[253,38],[345,77],[717,333],[858,405],[760,104],[419,90],[865,674],[897,811],[929,505],[977,415],[223,50],[999,81],[703,22],[422,299],[800,717],[668,550],[687,477],[596,42],[687,682],[883,481],[769,182],[733,28],[784,287],[556,501],[974,943],[251,148],[432,188],[623,511],[777,719],[820,556],[822,647],[864,828],[628,359],[985,699],[737,157],[716,301],[722,574],[588,243],[971,488],[410,408],[841,662],[340,18],[460,215],[390,340],[478,35],[874,847],[606,372],[169,158],[949,744],[571,170],[503,437],[238,93],[588,467],[461,281],[461,74],[378,150],[730,451],[765,498],[643,177],[170,143],[482,34],[547,157],[817,461],[284,164],[628,274],[135,37],[807,341],[912,794],[825,297],[300,265],[508,43],[885,315],[205,37],[807,89],[535,167],[608,539],[818,145],[301,114],[800,498],[712,409],[892,816],[187,105],[982,924],[792,457],[842,365],[973,742],[945,383],[699,646],[359,262],[372,300],[681,96],[912,471],[825,452],[820,797],[471,17],[846,10],[799,198],[787,736],[380,9],[442,334],[573,249],[798,258],[721,199],[760,557],[382,360],[922,157],[619,482],[814,565],[575,249],[934,919],[649,218],[760,727],[655,291],[593,109],[343,198],[624,329],[505,266],[703,485],[909,853],[706,134],[505,244],[334,181],[713,296],[839,600],[786,284],[954,315],[540,400],[444,90],[882,350],[749,118],[58,30],[743,327],[366,258],[907,435],[878,848],[859,786],[890,555],[593,550],[928,878],[298,134],[353,208],[795,487],[632,327],[464,372],[923,300],[781,748],[863,650],[915,305],[986,548],[729,227],[831,111],[769,660],[752,646],[981,664],[449,136],[575,516],[772,660],[801,591],[785,309],[844,365],[783,684],[373,319],[523,12],[849,385],[353,14],[698,313],[522,33],[471,245],[470,265],[184,32],[787,393],[918,633],[232,62],[721,94],[740,200],[467,427],[565,175],[340,177],[613,42],[729,561],[530,406],[687,351],[759,163],[937,463],[850,323],[834,32],[111,34],[911,292],[591,128],[978,693],[789,716],[399,199],[435,19],[876,441],[833,79],[394,175],[893,478],[986,35],[659,238],[665,257],[935,856],[248,131],[798,769],[807,276],[675,538],[960,470],[396,147],[529,478],[758,730],[460,362],[786,97],[602,125],[457,57],[909,786],[152,6],[780,237],[279,191],[987,780],[960,207],[894,605],[500,160],[934,168],[786,383],[276,59],[822,382],[957,107],[878,310],[203,192],[776,215],[522,204],[418,68],[896,136],[694,591],[510,187],[899,126],[697,319],[798,10],[964,517],[952,156],[222,98],[873,784],[442,371],[510,45],[950,103],[954,35],[890,192],[770,604],[737,250],[407,133],[698,445],[548,229],[727,566],[946,928],[180,51],[100,99],[565,227],[961,650],[487,32],[674,249],[232,115],[553,474],[485,127],[402,279],[918,214],[934,571],[661,473],[294,125],[985,79],[212,7],[554,237],[705,477],[833,186],[961,729],[542,38],[719,317],[766,659],[682,404],[575,351],[587,187],[704,443],[705,48],[822,404],[873,846],[948,695],[575,503],[847,84],[689,531],[365,229],[547,229],[902,182],[785,14],[740,63],[695,253],[741,664],[889,756],[983,710],[578,448],[903,853],[369,291],[937,343],[883,236],[603,254],[284,10],[892,395],[729,642],[790,714],[114,83],[863,15],[544,111],[671,205],[821,200],[863,398],[250,50],[996,613],[399,25],[786,582],[488,47],[665,495],[649,159],[784,275],[517,102],[879,159],[955,950],[928,686],[746,100],[689,433],[867,503],[812,303],[815,790],[562,302],[221,24],[906,634],[776,180],[396,217],[310,114],[821,694],[991,171],[695,24],[851,612],[561,157],[172,156],[960,105],[401,376],[769,521],[298,50],[490,279],[599,342],[364,23],[386,184],[112,107],[369,68],[947,797],[670,356],[375,152],[296,292],[504,109],[875,356],[958,731],[924,527],[692,605],[837,380],[461,381],[970,203],[482,333],[948,397],[380,374],[648,472],[562,6],[539,198],[457,195],[486,230],[444,363],[703,692],[778,513],[749,394],[620,345],[446,23],[774,757],[926,676],[720,139],[755,145],[711,18],[561,42],[927,246],[815,109],[891,863],[668,214],[947,394],[957,507],[438,231],[461,253],[867,814],[941,107],[628,158],[577,429],[730,2],[768,23],[964,317],[826,811],[629,126],[612,269],[833,613],[482,84],[351,271],[414,411],[994,53],[755,171],[603,344],[972,287],[628,415],[857,377],[952,898],[758,314],[869,413],[662,336],[709,291],[939,274],[965,616],[540,256],[565,461],[369,250],[312,118],[746,526],[734,679],[626,176],[818,463],[994,498],[884,173],[552,13],[352,19],[522,519],[395,97],[974,904],[752,353],[283,161],[439,78],[855,51],[797,765],[584,222],[980,676],[479,30],[752,579],[386,287],[906,853],[656,517],[269,231],[329,62],[821,241],[692,574],[449,132],[863,141],[285,133],[698,131],[806,751],[927,758],[508,180],[704,317],[859,634],[474,294],[904,274],[969,476],[580,136],[842,810],[830,693],[693,198],[466,353],[728,694],[900,302],[775,340],[427,77],[833,622],[690,476],[692,202],[922,684],[746,512],[950,846],[948,53],[985,248],[195,60],[478,319],[535,418],[954,327],[862,593],[333,138],[145,58],[914,109],[862,349],[726,561],[533,317],[986,79],[621,379],[445,93],[910,587],[999,822],[694,174],[511,260],[762,600],[952,775],[204,42],[663,647],[963,915],[586,25],[909,251],[527,89],[412,261],[775,284],[884,161],[869,378],[322,56],[793,53],[312,177],[750,376],[302,170],[982,760],[816,528],[514,301],[315,190],[897,525],[864,89],[872,675],[374,242],[594,42],[719,185],[979,568],[735,414],[722,322],[484,359],[972,210],[660,41],[635,309],[857,415],[469,312],[565,273],[881,739],[868,652],[828,206],[897,502],[536,7],[434,399],[848,280],[459,80],[910,476],[317,219],[659,4],[942,458],[833,638],[965,340],[365,159],[726,125],[240,235],[624,237],[749,692],[754,320],[917,289],[721,295],[258,74],[565,249],[949,182],[795,411],[913,556],[963,140],[826,570],[708,590],[764,662],[541,435],[748,132],[906,905],[765,247],[779,463],[618,526],[410,226],[624,467],[311,110],[166,54],[730,460],[859,307],[710,370],[834,176],[634,5],[575,557],[846,650],[314,165],[370,109],[942,55],[708,40],[645,371],[602,27],[853,529],[587,228],[763,612],[804,769],[795,639],[799,206],[348,118],[907,340],[750,671],[172,53],[782,746],[888,171],[880,450],[147,34],[483,315],[772,442],[142,49],[729,546],[556,341],[956,138],[794,230],[614,122],[235,82],[839,322],[719,178],[828,656],[714,99],[465,11],[428,341],[899,355],[817,249],[912,835],[185,177],[934,521],[422,16],[723,464],[475,57],[836,619],[868,811],[874,140],[453,410],[872,721],[609,56],[945,8],[519,353],[245,158],[358,126],[782,729],[991,971],[540,531],[774,452],[938,855],[728,209],[344,129],[892,60],[801,201],[536,127],[566,322],[747,600],[748,229],[650,66],[390,322],[882,587],[942,645],[881,72],[530,489],[527,367],[326,139],[959,51],[59,56],[602,342],[737,567],[857,397],[752,339],[868,400],[703,528],[855,340],[303,181],[817,483],[764,433],[833,47],[891,286],[559,520],[336,181],[548,121],[840,787],[772,618],[979,607],[567,382],[751,420],[828,111],[615,360],[86,5],[852,355],[878,159],[666,498],[623,615],[967,206],[818,639],[910,748],[887,845],[818,703],[742,253],[205,88],[948,876],[467,10],[996,598],[590,215],[885,270],[809,207],[712,229],[609,58],[799,299],[742,267],[405,169],[902,370],[415,36],[369,295],[816,814],[152,78],[616,453],[736,575],[999,687],[697,133],[725,386],[890,44],[423,59],[44,10],[818,87],[777,204],[296,93],[989,522],[669,619],[85,33],[906,558],[434,397],[821,359],[764,115],[673,453],[989,984],[709,199],[968,132],[654,205],[510,188],[111,10],[687,354],[413,79],[555,546],[712,135],[323,207],[286,260],[803,798],[568,186],[547,423],[646,467],[177,175],[886,611],[953,840],[929,373],[774,520],[955,326],[755,657],[661,291],[911,49],[850,536],[501,31],[549,187],[977,669],[884,824],[351,34],[382,233],[86,34],[738,108],[631,31],[697,53],[691,478],[813,360],[541,10],[184,70],[975,533],[937,785],[155,113],[927,37],[910,720],[190,86],[816,379],[746,333],[260,118],[548,283],[847,733],[971,898],[365,95],[703,404],[950,283],[664,415],[885,884],[800,543],[973,791],[760,184],[732,701],[988,917],[487,291],[616,145],[968,253],[953,473],[422,42],[837,118],[968,13],[532,66],[373,308],[979,248],[721,316],[910,554],[637,128],[706,592],[516,173],[605,84],[294,58],[739,496],[416,145],[698,558],[230,151],[682,446],[763,103],[937,300],[606,92],[888,887],[972,654],[658,444],[349,18],[771,29],[714,117],[986,286],[907,309],[325,28],[743,734],[306,233],[301,251],[405,376],[909,382],[955,565],[659,152],[897,878],[621,136],[952,222],[971,508],[577,131],[725,124],[950,66],[627,270],[418,412],[467,409],[904,385],[466,404],[978,747],[742,652],[883,133],[802,282],[816,488],[171,55],[891,506],[792,431],[877,555],[439,406],[732,272],[914,402],[370,221],[852,198],[183,107],[602,356],[658,173],[661,99],[977,689],[620,64],[828,790],[525,489],[533,54],[613,407],[170,71],[999,976],[707,201],[440,27],[301,127],[516,135],[611,360],[829,787],[805,197],[754,601],[805,435],[576,232],[750,482],[530,276],[711,11],[693,270],[690,317],[693,691],[604,258],[698,342],[667,397],[737,67],[655,82],[277,185],[445,337],[537,303],[309,40],[491,142],[295,40],[346,293],[759,130],[844,60],[932,809],[948,248],[820,513],[767,197],[667,644],[733,358],[899,626],[640,185],[928,193],[401,305],[525,129],[770,353],[987,796],[318,182],[735,322],[767,558],[304,88],[245,131],[187,96],[916,275],[263,124],[262,32],[200,118],[925,211],[491,470],[513,146],[667,1],[742,156],[807,155],[495,286],[860,411],[784,676],[988,742],[409,332],[208,28],[970,360],[929,77],[751,251],[95,5],[603,479],[385,314],[377,127],[646,108],[849,435],[926,549],[278,160],[390,141],[455,219],[293,2],[915,579],[976,152],[525,92],[855,841],[256,69],[937,789],[984,758],[589,376],[953,609],[728,645],[217,176],[930,379],[385,139],[793,312],[959,296],[197,132],[784,517],[567,112],[649,138],[908,383],[660,595],[876,377],[519,267],[656,183],[701,496],[947,138],[829,786],[666,463],[929,588],[535,214],[893,759],[413,123],[895,469],[343,92],[414,50],[270,167],[347,190],[740,257],[563,521],[645,48],[768,317],[191,7],[558,388],[236,223],[964,360],[708,306],[736,137],[380,175],[884,99],[970,835],[659,380],[348,76],[425,198],[773,219],[840,502],[948,424],[722,309],[617,399],[710,108],[132,28],[487,294],[741,239],[972,202],[996,650],[932,561],[355,96],[927,197],[746,160],[378,237],[837,673],[794,586],[918,414],[684,11],[802,225],[908,41],[914,870],[150,86],[940,340],[922,491],[842,83],[587,378],[276,92],[791,444],[888,596],[478,267],[371,191],[295,47],[938,698],[734,505],[938,602],[550,385],[650,409],[976,388],[513,322],[634,485],[718,54],[666,247],[660,517],[942,109],[109,43],[840,790],[970,172],[77,52],[572,253],[929,664],[828,140],[481,331],[547,426],[835,266],[519,332],[850,788],[909,567],[967,36],[780,529],[809,547],[649,352],[114,85],[58,38],[874,98],[951,733],[910,44],[840,551],[761,207],[891,866],[889,291],[636,627],[910,233],[535,81],[760,144],[474,34],[797,622],[867,719],[469,114],[960,258],[870,89],[339,159],[530,228],[592,319],[709,258],[741,124],[937,843],[525,272],[685,341],[648,558],[896,223],[980,750],[473,94],[639,340],[434,280],[589,44],[829,420],[895,865],[926,467],[526,187],[813,408],[769,590],[914,238],[924,384],[561,503],[328,125],[755,516],[526,524],[852,32],[952,418],[983,328],[799,502],[997,670],[986,177],[548,387],[41,29],[716,224],[763,361],[812,521],[837,230],[939,269],[663,21],[784,536],[503,366],[452,108],[550,61],[599,132],[611,100],[746,618],[822,96],[580,94],[705,70],[382,82],[339,265],[327,216],[786,189],[822,750],[862,288],[999,728],[822,640],[688,495],[521,383],[984,625],[620,149],[727,668],[986,321],[911,216],[924,632],[512,130],[745,550],[242,162],[891,409],[170,30],[820,666],[841,615],[116,96],[267,139],[722,260],[778,60],[442,131],[358,212],[640,287],[980,538],[635,495],[950,189],[61,21],[429,211],[637,135],[676,661],[967,552],[923,482],[421,101],[975,665],[242,59],[699,471],[858,173],[837,13],[805,279],[459,314],[486,400],[753,227],[751,416],[764,43],[417,273],[574,157],[490,187],[479,27],[746,260],[466,158],[377,187],[630,304],[903,7],[100,37],[237,80],[639,90],[823,755],[797,592],[926,428],[679,383],[565,9],[916,510],[295,281],[737,539],[971,726],[434,119],[970,340],[972,676],[989,932],[741,355],[800,268],[691,516],[891,720],[974,40],[889,879],[761,51],[287,263],[628,434],[710,460],[868,114],[665,174],[384,193],[887,95],[716,115],[335,88],[707,520],[586,535],[335,261],[621,293],[766,477],[978,746],[635,239],[153,45],[332,109],[598,466],[766,101],[990,340],[253,208],[856,721],[324,151],[767,487],[589,336],[858,415],[591,503],[820,514],[993,911],[510,199],[842,97],[984,905],[960,835],[443,22],[854,403],[678,201],[672,113],[124,21],[998,881],[526,74],[843,268],[503,78],[369,104],[933,693],[301,12],[315,239],[754,165],[751,265],[500,383],[643,197],[891,260],[412,348],[882,789],[990,302],[713,222],[409,288],[514,223],[476,474],[992,357],[538,277],[891,1],[939,803],[473,411],[900,312],[757,711],[773,180],[544,530],[492,249],[533,282],[941,203],[440,16],[611,288],[379,112],[486,439],[995,225],[950,54],[462,459],[855,243],[549,451],[797,767],[974,194],[842,244],[142,42],[689,203],[658,139],[893,466],[706,369],[783,433],[5,2],[613,334],[624,125],[745,717],[916,369],[736,136],[964,180],[979,181],[571,52],[873,89],[857,506],[870,78],[355,268],[589,76],[582,398],[578,42],[879,614],[798,155],[929,82],[995,884],[694,176],[480,80],[715,250],[307,126],[323,149],[687,133],[922,915],[997,967],[608,97],[925,181],[530,504],[622,583],[938,297],[315,68],[721,121],[658,19],[835,559],[614,423],[501,326],[741,45],[819,594],[859,770],[675,67],[486,196],[643,530],[726,656],[986,335],[412,166],[136,24],[739,666],[752,263],[629,81],[884,411],[868,533],[706,91],[521,441],[888,750],[578,107],[986,435],[653,89],[914,788],[197,50],[743,593],[441,275],[284,210],[432,208],[820,10],[829,269],[473,113],[482,110],[807,458],[744,390],[463,245],[714,329],[958,195],[160,92],[925,765],[561,344],[870,745],[715,421],[945,753],[843,92],[770,384],[706,147],[810,14],[467,194],[843,697],[114,95],[234,33],[387,270],[959,481],[789,676],[308,123],[944,734],[494,321],[564,200],[983,464],[886,224],[726,644],[975,270],[941,752],[915,23],[789,587],[723,128],[996,129],[545,398],[761,526],[915,417],[509,243],[448,43],[935,36],[822,741],[888,477],[613,114],[981,750],[973,739],[332,50],[748,556],[759,560],[980,392],[602,261],[604,3],[951,880],[654,147],[831,491],[353,263],[550,126],[509,407],[995,636],[829,347],[204,71],[695,173],[631,15],[493,372],[479,305],[885,423],[999,850],[726,469],[180,174],[934,142],[935,201],[328,198],[976,544],[849,207],[901,350],[869,103],[656,555],[202,201],[902,670],[237,116],[976,32],[829,646],[276,246],[206,130],[364,229],[678,631],[402,186],[395,73],[377,60],[535,387],[547,502],[887,804],[649,127],[788,461],[272,260],[862,670],[475,425],[983,745],[955,572],[768,257],[722,654],[574,213],[746,151],[983,184],[684,482],[999,305],[143,47],[379,168],[442,124],[694,377],[572,416],[378,239],[420,23],[534,247],[304,78],[708,618],[712,186],[392,310],[810,380],[643,253],[527,461],[709,686],[635,130],[442,181],[660,155],[884,137],[758,363],[828,700],[695,108],[353,294],[522,194],[490,342],[380,204],[900,123],[387,350],[201,142],[890,757],[254,138],[988,773],[574,378],[280,116],[393,115],[881,875],[831,824],[658,297],[757,331],[427,24],[923,116],[796,148],[219,172],[137,92],[770,391],[729,24],[658,251],[986,24],[630,565],[568,368],[952,945],[922,910],[952,250],[743,278],[616,607],[447,399],[887,32],[889,271],[791,91],[586,368],[687,653],[889,787],[165,85],[124,25],[963,500],[397,258],[816,683],[613,61],[974,746],[974,630],[903,707],[822,103],[811,614],[755,311],[451,268],[496,225],[387,301],[907,825],[981,526],[772,201],[598,523],[806,643],[517,351],[182,155],[511,506],[911,416],[924,281],[586,118],[640,290],[720,182],[707,154],[602,512],[584,128],[778,15],[381,86],[615,45],[663,331],[981,819],[995,820],[566,444],[693,650],[793,381],[803,606],[495,212],[379,203],[908,632],[590,525],[427,228],[306,182],[830,119],[608,191],[638,236],[327,58],[295,247],[297,57],[319,278],[781,11],[860,697],[749,164],[791,29],[425,415],[540,348],[409,113],[589,309],[85,54],[926,411],[742,610],[618,188],[981,758],[397,382],[128,126],[691,462],[950,886],[492,85],[835,395],[916,233],[933,324],[857,242],[957,242],[667,142],[937,116],[682,166],[873,394],[95,36],[880,394],[842,22],[966,142],[825,663],[472,242],[182,117],[655,302],[813,288],[103,69],[788,649],[742,701],[551,463],[857,762],[928,353],[745,171],[363,292],[960,505],[702,13],[718,236],[473,440],[415,23],[704,120],[700,434],[764,139],[519,416],[900,229],[274,209],[875,732],[945,340],[971,118],[807,10],[767,424],[788,248],[294,139],[615,232],[848,536],[497,314],[477,300],[983,498],[985,626],[918,477],[438,176],[575,490],[178,176],[990,653],[288,122],[253,189],[891,432],[514,89],[617,143],[373,287],[983,547],[852,361],[810,651],[557,514],[937,542],[968,320],[360,78],[940,292],[865,273],[831,18],[488,109],[383,0],[852,617],[868,694],[127,43],[238,230],[915,260],[616,156],[387,112],[497,477],[868,446],[749,590],[462,307],[854,329],[762,323],[960,638],[823,686],[132,93],[717,139],[735,59],[516,134],[815,2],[902,11],[322,159],[825,298],[339,231],[783,107],[423,328],[717,458],[943,407],[620,20],[734,34],[597,208],[431,364],[84,80],[401,21],[901,183],[631,190],[579,363],[997,361],[923,859],[960,186],[566,47],[757,419],[490,479],[763,704],[680,128],[561,144],[518,476],[616,514],[492,184],[737,18],[126,22],[667,300],[960,164],[960,640],[174,154],[469,294],[748,64],[760,571],[692,366],[733,493],[438,18],[256,114],[927,163],[684,286],[317,177],[527,444],[569,425],[568,430],[467,401],[889,562],[388,309],[585,509],[986,624],[601,461],[193,79],[67,26],[822,620],[790,178],[625,345],[899,380],[945,416],[420,222],[687,626],[989,97],[861,764],[578,365],[513,288],[485,158],[819,706],[804,230],[460,56],[472,293],[846,143],[287,174],[683,406],[971,698],[33,7],[999,214],[752,254],[165,154],[757,47],[969,787],[995,615],[493,38],[201,108],[913,330],[992,947],[794,38],[174,9],[790,408],[926,54],[437,141],[931,856],[619,178],[627,584],[545,198],[845,279],[892,258],[833,758],[960,166],[390,54],[967,941],[994,978],[669,568],[524,213],[610,369],[961,567],[924,115],[318,137],[554,214],[535,96],[131,77],[701,316],[348,324],[785,296],[527,449],[346,85],[272,125],[850,276],[965,746],[532,476],[92,2],[859,350],[231,205],[614,8],[961,654],[801,121],[488,50],[984,504],[636,474],[674,588],[89,48],[614,443],[477,444],[562,137],[596,157],[992,684],[202,168],[446,52],[450,167],[295,94],[874,538],[516,338],[924,1],[775,656],[894,32],[140,125],[856,733],[653,205],[597,256],[948,415],[736,158],[934,91],[680,369],[746,588],[816,208],[442,277],[975,35],[488,454],[755,663],[655,629],[759,467],[292,170],[996,743],[527,132],[846,324],[641,228],[933,391],[333,7],[610,262],[641,303],[380,16],[585,2],[930,683],[870,478],[485,119],[433,76],[904,515],[955,65],[901,700],[358,19],[19,5],[911,65],[901,763],[731,575],[519,286],[961,613],[742,282],[543,509],[814,244],[913,13],[935,551],[472,341],[588,248],[957,447],[412,352],[693,417],[703,112],[764,430],[869,326],[651,393],[952,406],[689,236],[487,273],[575,143],[305,160],[768,357],[537,327],[811,512],[826,146],[939,508],[425,300],[526,453],[935,493],[527,381],[939,49],[913,893],[474,193],[877,385],[625,93],[221,195],[854,655],[895,606],[748,708],[549,262],[549,483],[604,294],[965,529],[912,624],[618,332],[761,554],[965,857],[855,356],[631,396],[719,71],[100,24],[844,478],[982,159],[897,339],[786,372],[314,188],[661,354],[723,702],[855,713],[907,190],[721,514],[672,230],[442,149],[648,111],[503,14],[487,419],[408,189],[684,415],[773,451],[922,258],[497,436],[778,167],[970,739],[817,513],[767,611],[344,43],[953,64],[472,340],[167,20],[997,428],[770,498],[354,51],[676,493],[807,556],[616,480],[940,544],[297,29],[853,766],[874,179],[997,362],[905,633],[928,625],[872,562],[844,328],[284,125],[757,89],[938,516],[813,142],[919,336],[443,360],[624,204],[830,747],[859,364],[493,276],[370,295],[733,564],[845,816],[596,531],[671,575],[953,161],[645,427],[635,489],[655,53],[314,194],[389,293],[836,197],[989,208],[751,129],[881,471],[945,441],[559,362],[536,248],[491,298],[545,68],[619,431],[332,15],[691,674],[960,742],[891,591],[990,56],[777,422],[899,255],[931,565],[963,167],[65,3],[944,579],[816,239],[827,134],[558,499],[988,836],[868,743],[395,42],[896,251],[999,206],[707,126],[625,195],[251,210],[685,599],[829,182],[870,239],[950,711],[737,692],[192,109],[914,280],[848,769],[662,6],[778,71],[217,211],[704,563],[206,52],[760,316],[869,222],[575,215],[925,267],[381,131],[903,177],[887,262],[724,622],[613,134],[746,627],[601,165],[197,58],[419,206],[891,78],[560,210],[795,674],[832,400],[595,353],[648,542],[487,445],[880,484],[421,382],[363,25],[797,33],[937,768],[590,352],[529,481],[367,87],[631,622],[738,254],[466,118],[952,241],[838,759],[447,48],[358,149],[851,638],[786,454],[769,459],[451,211],[398,19],[135,131],[411,310],[255,181],[433,116],[911,640],[716,109],[889,720],[852,541],[348,268],[252,126],[527,245],[374,325],[714,110],[591,168],[53,47],[482,189],[797,236],[863,353],[682,583],[831,152],[543,210],[297,96],[922,24],[714,122],[773,285],[198,125],[876,823],[970,689],[866,292],[606,333],[528,185],[647,18],[298,125],[313,264],[594,252],[379,195],[902,649],[212,16],[318,146],[719,413],[727,482],[517,328],[390,133],[769,111],[450,345],[750,284],[849,602],[973,733],[770,135],[402,219],[303,178],[914,661],[745,632],[990,139],[621,154],[637,527],[989,868],[922,806],[417,10],[940,614],[191,183],[731,89],[625,351],[539,521],[827,252],[595,573],[682,130],[559,430],[962,907],[945,164],[235,200],[891,786],[699,597],[545,186],[817,69],[646,422],[995,17],[950,921],[798,629],[795,778],[254,143],[849,172],[479,136],[972,612],[792,343],[460,356],[780,487],[976,564],[407,76],[962,410],[677,215],[916,585],[995,768],[705,290],[884,418],[243,217],[773,650],[622,401],[855,186],[967,763],[970,400],[895,824],[751,513],[611,327],[768,51],[389,278],[660,648],[446,194],[356,243],[674,313],[674,603],[456,438],[205,70],[323,67],[785,319],[837,731],[851,152],[869,478],[863,596],[958,342],[970,317],[176,160],[953,38],[756,43],[944,797],[765,4],[958,272],[70,19],[915,791],[754,211],[578,362],[328,299],[783,640],[281,254],[745,432],[605,186],[618,323],[319,99],[463,254],[296,248],[610,92],[945,891],[980,863],[517,24],[667,166],[654,432],[473,70],[823,592],[927,98],[961,82],[951,512],[871,291],[681,102],[281,201],[932,803],[929,308],[871,763],[589,478],[663,457],[200,141],[711,142],[841,23],[641,68],[669,499],[830,749],[928,341],[843,292],[162,135],[881,22],[990,772],[770,31],[765,113],[319,11],[955,233],[91,77],[102,13],[682,677],[458,285],[362,270],[645,35],[836,564],[886,790],[745,31],[511,99],[825,279],[873,558],[511,479],[952,584],[465,238],[218,139],[532,29],[597,29],[557,188],[241,105],[872,723],[723,565],[814,31],[843,726],[79,55],[990,473],[431,151],[935,673],[195,6],[813,355],[834,86],[444,76],[885,117],[113,11],[386,201],[801,498],[873,146],[908,339],[712,555],[449,114],[984,366],[29,3],[856,1],[624,583],[857,408],[693,544],[650,591],[760,756],[743,304],[959,347],[870,129],[632,453],[213,178],[191,1],[856,196],[531,483],[893,190],[205,203],[984,674],[816,755],[494,13],[829,490],[732,202],[891,121],[712,12],[633,324],[665,48],[924,771],[443,428],[553,501],[887,345],[702,294],[703,517],[44,21],[756,47],[784,319],[985,912],[995,212],[812,798],[888,532],[926,90],[804,624],[516,456],[827,324],[717,6],[762,502],[952,681],[747,682],[967,297],[377,101],[650,44],[885,25],[740,433],[923,784],[994,327],[994,55],[989,341],[858,512],[993,233],[950,933],[546,492],[750,346],[630,559],[604,535],[652,563],[488,265],[163,124],[967,589],[540,381],[309,139],[799,424],[852,647],[446,222],[934,163],[280,144],[645,484],[800,142],[306,133],[988,521],[968,17],[815,399],[166,109],[961,401],[206,196],[527,81],[932,209],[462,104],[801,670],[158,120],[787,322],[260,153],[261,187],[711,578],[544,441],[832,591],[895,616],[985,155],[995,340],[367,42],[941,223],[623,210],[623,551],[915,473],[678,440],[781,32],[107,52],[760,711],[922,524],[692,238],[618,26],[225,194],[683,333],[842,105],[367,220],[955,549],[949,771],[721,446],[430,114],[301,147],[256,57],[508,303],[976,150],[319,192],[732,143],[911,16],[976,616],[907,801],[572,222],[460,229],[633,546],[820,717],[252,244],[877,202],[775,69],[733,105],[166,164],[491,479],[470,224],[509,49],[321,148],[957,496],[744,80],[706,437],[377,268],[789,487],[783,95],[791,40],[753,23],[688,517],[507,256],[662,346],[811,681],[450,266],[837,811],[360,215],[785,161],[925,256],[973,377],[969,503],[777,261],[209,41],[318,253],[926,257],[924,118],[592,40],[812,682],[953,188],[989,567],[977,862],[391,241],[959,399],[355,9],[893,710],[573,219],[845,540],[945,54],[377,170],[724,238],[994,456],[445,12],[911,225],[698,88],[772,735],[847,728],[637,168],[692,59],[735,339],[335,114],[483,126],[355,210],[714,387],[731,700],[835,805],[996,959],[855,83],[942,33],[810,10],[964,696],[247,159],[773,22],[589,295],[548,103],[455,260],[504,393],[906,416],[639,72],[656,438],[607,524],[800,149],[855,461],[929,666],[753,387],[851,266],[762,333],[478,423],[206,15],[598,596],[816,228],[917,434],[904,737],[437,376],[900,697],[972,573],[170,150],[823,615],[917,295],[696,343],[320,43],[292,40],[828,120],[986,347],[953,415],[579,435],[371,250],[870,824],[217,199],[76,9],[255,97],[581,370],[134,108],[971,267],[509,250],[218,92],[961,519],[588,16],[657,93],[770,242],[931,867],[730,512],[740,3],[618,187],[397,143],[963,161],[858,215],[775,430],[325,199],[616,165],[971,484],[962,193],[665,474],[825,130],[781,100],[989,28],[960,471],[569,405],[702,295],[726,329],[673,109],[335,3],[522,195],[819,610],[620,181],[512,186],[911,403],[202,144],[951,798],[785,286],[714,649],[717,313],[569,552],[920,859],[461,24],[884,550],[949,755],[183,157],[933,417],[961,12],[284,34],[600,596],[645,1],[956,508],[961,852],[837,174],[730,160],[684,430],[745,699],[890,345],[514,333],[782,761],[728,168],[680,486],[780,741],[550,35],[259,126],[725,314],[695,101],[921,602],[690,503],[775,120],[374,244],[679,324],[655,154],[781,662],[722,489],[249,87],[914,717],[960,77],[944,463],[521,177],[616,548],[476,396],[511,164],[543,185],[965,579],[210,110],[248,2],[884,376],[760,477],[423,261],[764,682],[757,5],[989,862],[700,373],[580,509],[299,170],[144,13],[579,312],[878,142],[686,646],[994,26],[266,173],[519,392],[378,30],[815,794],[698,300],[556,318],[576,341],[988,378],[459,286],[986,211],[255,100],[944,633],[661,621],[194,181],[920,262],[763,255],[505,352],[967,32],[557,411],[706,54],[472,376],[913,261],[780,29],[819,172],[83,79],[953,631],[984,501],[693,172],[602,24],[979,561],[456,178],[991,320],[590,147],[820,185],[642,122],[928,1],[821,647],[526,466],[438,100],[940,730],[870,158],[973,271],[630,509],[478,36],[799,459],[838,407],[808,464],[318,280],[734,108],[574,336],[804,552],[787,768],[868,759],[561,478],[442,98],[717,611],[887,867],[765,711],[789,415],[844,150],[352,159],[504,185],[983,442],[178,161],[724,130],[566,67],[805,590],[487,467],[861,194],[655,84],[753,501],[549,511],[999,961],[414,67],[372,222],[626,268],[789,403],[827,314],[845,655],[635,236],[707,156],[908,823],[982,96],[907,358],[705,577],[479,55],[992,894],[490,267],[708,646],[622,452],[670,156],[578,283],[540,285],[781,309],[664,342],[645,572],[906,662],[803,8],[748,743],[979,562],[859,192],[705,545],[768,346],[974,193],[804,472],[215,212],[354,348],[977,53],[616,604],[790,690],[777,716],[946,514],[901,770],[688,182],[295,89],[437,21],[864,332],[806,198],[864,206],[490,198],[554,499],[272,185],[785,610],[976,422],[482,259],[584,165],[845,116],[326,257],[795,643],[393,253],[862,817],[880,465],[560,104],[840,323],[747,651],[868,20],[914,904],[780,58],[772,387],[880,625],[633,239],[532,315],[759,470],[862,830],[915,150],[822,23],[476,179],[731,576],[450,161],[450,268],[495,81],[286,207],[861,822],[117,21],[889,793],[333,227],[928,611],[595,540],[933,688],[104,54],[721,382],[847,401],[810,367],[825,484],[744,506],[925,2],[868,229],[936,889],[947,323],[83,25],[698,399],[370,164],[901,704],[709,270],[947,562],[861,332],[819,496],[931,423],[769,496],[697,253],[718,357],[983,460],[740,285],[839,308],[276,259],[842,99],[692,217],[760,676],[685,668],[430,198],[865,818],[866,68],[380,305],[782,617],[747,476],[820,28],[909,406],[943,878],[579,386],[341,249],[514,170],[994,196],[501,455],[560,88],[794,414],[957,329],[780,665],[533,379],[690,256],[575,187],[424,376],[762,325],[654,547],[312,247],[119,57],[823,387],[595,487],[605,162],[361,183],[772,436],[958,423],[810,37],[855,152],[287,98],[563,85],[605,367],[448,89],[431,370],[862,361],[867,85],[913,360],[214,27],[925,76],[712,150],[842,143],[892,669],[871,232],[718,229],[535,83],[889,403],[589,275],[391,38],[266,247],[851,439],[390,280],[819,20],[291,13],[718,687],[306,64],[838,791],[924,692],[475,312],[635,352],[720,643],[545,431],[728,415],[649,354],[791,544],[426,186],[355,171],[248,10],[539,496],[443,204],[812,370],[682,136],[730,424],[755,151],[401,162],[633,26],[631,311],[923,170],[632,426],[718,118],[249,96],[237,77],[879,513],[564,137],[910,118],[541,90],[750,45],[779,252],[879,432],[949,196],[95,87],[994,685],[812,33],[360,336],[696,330],[858,697],[408,342],[736,241],[818,69],[803,203],[954,737],[496,87],[445,414],[368,128],[960,149],[724,646],[396,294],[813,625],[293,189],[738,461],[419,398],[830,188],[963,584],[998,728],[636,173],[478,160],[959,327],[961,26],[335,237],[945,605],[895,238],[931,475],[851,485],[593,323],[627,333],[863,10],[451,383],[651,306],[764,0],[965,572],[436,33],[862,41],[635,393],[84,41],[388,216],[883,295],[866,49],[469,84],[667,205],[339,195],[981,932],[646,345],[949,335],[270,233],[989,59],[965,200],[562,227],[999,89],[361,310],[947,70],[635,25],[795,300],[792,599],[444,361],[234,152],[388,23],[921,796],[719,269],[928,422],[485,302],[963,616],[228,142],[675,189],[337,207],[490,242],[609,220],[906,86],[572,178],[859,648],[618,536],[483,7],[450,289],[962,835],[848,660],[841,567],[998,259],[426,252],[464,463],[293,156],[979,496],[920,294],[880,835],[996,614],[983,793],[574,533],[745,34],[772,362],[386,291],[854,323],[951,873],[675,179],[327,157],[828,717],[772,419],[889,400],[965,443],[434,278],[616,463],[741,643],[997,204],[318,62],[349,326],[976,725],[249,156],[853,773],[534,227],[696,253],[620,333],[427,279],[638,255],[663,552],[975,211],[871,370],[951,185],[934,241],[819,264],[733,436],[840,508],[794,246],[625,546],[979,811],[545,480],[812,287],[436,424],[937,196],[455,267],[887,136],[878,726],[728,573],[683,195],[496,116],[980,695],[784,675],[569,45],[532,382],[765,306],[117,12],[594,478],[774,421],[446,139],[901,170],[892,65],[808,155],[651,38],[857,655],[864,464],[279,249],[212,96],[699,645],[322,266],[999,750],[626,428],[542,403],[391,91],[788,767],[476,241],[944,616],[639,257],[923,513],[807,676],[862,340],[374,330],[447,311],[716,256],[843,239],[926,149],[284,235],[919,253],[259,256],[919,899],[485,8],[513,188],[462,428],[644,412],[884,718],[593,292],[749,344],[740,465],[648,108],[713,28],[719,149],[872,544],[450,359],[906,425],[872,236],[955,741],[985,93],[927,85],[91,39],[291,148],[941,315],[610,566],[990,25],[591,464],[222,37],[861,330],[991,622],[879,787],[846,724],[850,486],[949,775],[338,138],[607,413],[819,807],[443,343],[912,220],[830,25],[787,665],[552,438],[149,126],[953,6],[721,482],[96,53],[976,665],[984,13],[717,481],[931,113],[719,56],[872,419],[989,487],[224,146],[868,847],[44,7],[221,152],[617,424],[511,108],[411,256],[849,374],[922,330],[882,137],[515,7],[807,45],[246,244],[802,497],[828,622],[923,605],[864,814],[435,37],[603,325],[289,79],[961,794],[868,385],[608,198],[986,249],[914,861],[890,594],[441,439],[488,434],[974,896],[950,756],[233,161],[806,351],[78,5],[551,395],[838,138],[870,691],[945,457],[802,718],[798,638],[953,565],[965,737],[986,927],[916,439],[726,580],[197,130],[592,174],[789,760],[720,562],[980,460],[871,312],[493,258],[677,192],[965,390],[591,412],[876,508],[555,71],[601,324],[175,100],[256,9],[796,579],[958,879],[557,296],[867,462],[228,9],[481,113],[778,550],[988,509],[709,157],[793,186],[182,159],[736,675],[856,8],[196,92],[936,745],[943,394],[560,227],[381,144],[709,611],[986,835],[844,519],[471,319],[565,192],[289,107],[836,259],[755,556],[295,222],[723,335],[980,539],[839,506],[921,790],[747,65],[340,174],[441,252],[428,207],[953,276],[743,104],[443,368],[830,503],[584,124],[627,26],[583,128],[824,453],[927,884],[798,176],[756,693],[755,464],[739,216],[837,777],[793,226],[394,389],[900,537],[796,357],[800,547],[680,93],[831,106],[779,582],[669,312],[960,136],[417,386],[792,422],[679,455],[832,156],[402,30],[855,496],[620,592],[980,230],[544,175],[959,384],[863,606],[561,457],[488,53],[599,528],[210,24],[614,43],[598,320],[86,40],[414,124],[484,317],[504,168],[984,629],[841,485],[946,617],[843,317],[823,325],[979,265],[975,624],[853,363],[892,31],[613,291],[545,403],[517,89],[798,153],[485,450],[400,352],[486,203],[840,683],[937,694],[946,747],[987,201],[925,163],[628,537],[675,458],[954,710],[779,555],[783,183],[759,123],[764,588],[388,212],[373,7],[526,255],[548,515],[279,186],[883,558],[601,407],[641,434],[568,467],[934,847],[788,737],[933,290],[573,130],[930,417],[857,424],[685,320],[951,776],[355,354],[412,33],[752,121],[934,863],[577,456],[487,167],[862,774],[695,279],[865,367],[962,346],[930,396],[931,440],[944,81],[609,96],[985,77],[710,90],[845,9],[593,452],[725,643],[928,246],[474,83],[664,438],[550,521],[930,64],[779,335],[399,48],[568,310],[498,284],[941,300],[743,564],[730,309],[740,532],[528,317],[785,671],[953,179],[428,324],[522,264],[417,284],[911,580],[97,82],[766,674],[451,139],[845,55],[886,280],[787,565],[945,36],[672,438],[775,539],[854,784],[526,387],[819,137],[482,190],[189,118],[450,373],[344,65],[604,12],[893,628],[520,52],[802,469],[732,337],[408,351],[541,390],[609,272],[414,44],[832,675],[438,114],[887,415],[924,900],[936,648],[739,114],[667,502],[409,26],[591,256],[641,426],[714,692],[662,472],[266,149],[459,165],[811,487],[934,339],[744,412],[882,73],[985,331],[925,260],[707,179],[799,483],[875,167],[311,144],[996,712],[459,411],[596,415],[147,21],[909,488],[818,728],[970,67],[914,405],[998,810],[352,223],[966,809],[745,624],[870,652],[233,123],[648,278],[783,250],[714,359],[984,641],[966,293],[939,39],[812,522],[941,544],[887,426],[753,571],[448,291],[477,141],[832,731],[964,597],[185,1],[674,157],[780,253],[387,257],[904,447],[713,407],[995,938],[872,399],[786,306],[467,173],[989,467],[619,77],[791,311],[269,27],[57,19],[621,16],[579,69],[491,143],[350,96],[822,99],[862,168],[940,223],[707,575],[735,214],[704,66],[539,260],[500,78],[320,114],[132,60],[579,96],[962,478],[705,605],[578,4],[274,182],[876,810],[712,254],[709,692],[607,164],[944,155],[463,131],[895,290],[289,180],[192,165],[534,292],[888,461],[669,98],[660,277],[521,261],[381,198],[353,253],[685,50],[535,500],[588,436],[917,93],[546,473],[786,362],[458,247],[943,431],[558,196],[950,901],[193,184],[932,266],[984,174],[853,600],[517,133],[314,252],[594,230],[890,526],[679,644],[989,265],[554,477],[863,1],[232,120],[346,250],[694,80],[385,300],[338,21],[918,501],[701,158],[389,223],[565,420],[952,307],[761,557],[916,334],[139,104],[678,498],[905,344],[889,492],[967,864],[793,54],[621,548],[348,202],[708,662],[491,418],[664,624],[808,165],[832,818],[688,210],[802,734],[277,214],[472,53],[934,483],[895,240],[585,581],[461,12],[804,301],[470,264],[942,625],[768,734],[682,223],[340,241],[799,275],[688,285],[714,146],[769,156],[365,2],[737,16],[752,275],[227,118],[503,439],[794,67],[682,247],[784,541],[129,22],[867,811],[940,19],[855,639],[495,111],[667,595],[485,286],[552,1],[228,127],[953,662],[566,340],[447,67],[497,204],[356,63],[645,271],[646,513],[350,9],[996,155],[262,100],[547,376],[645,637],[969,549],[647,491],[589,334],[460,208],[526,475],[617,485],[776,76],[731,643],[337,6],[833,339],[515,453],[707,169],[496,235],[487,39],[904,49],[108,92],[563,395],[529,396],[922,774],[692,521],[965,882],[638,87],[503,138],[801,572],[374,319],[294,189],[989,814],[425,142],[527,395],[500,22],[747,586],[940,280],[848,16],[877,354],[727,604],[987,973],[159,52],[452,280],[842,455],[812,569],[819,355],[182,25],[121,100],[602,472],[621,312],[988,953],[119,35],[529,448],[948,31],[771,17],[515,130],[794,382],[345,52],[908,191],[376,126],[984,337],[546,51],[981,679],[997,38],[893,773],[397,281],[824,76],[365,277],[869,684],[791,294],[892,240],[874,292],[941,624],[985,173],[320,130],[352,332],[503,156],[802,139],[672,299],[282,207],[939,299],[590,479],[699,196],[974,653],[550,164],[643,490],[525,198],[159,2],[862,400],[473,27],[981,421],[853,264],[380,24],[949,866],[737,175],[686,539],[266,156],[980,65],[923,469],[515,208],[405,2],[677,58],[912,515],[863,496],[508,398],[927,311],[972,508],[672,249],[875,332],[968,634],[177,9],[371,335],[944,717],[817,121],[933,250],[421,340],[856,44],[152,53],[447,356],[660,476],[184,172],[535,453],[271,236],[749,252],[711,270],[519,492],[732,497],[584,341],[515,419],[151,120],[662,216],[824,484],[719,281],[748,693],[601,18],[578,237],[772,435],[769,734],[377,282],[407,270],[967,465],[719,410],[519,469],[801,368],[897,257],[866,244],[636,319],[810,658],[190,179],[505,222],[685,186],[581,99],[986,797],[695,416],[296,236],[132,3],[660,649],[960,706],[971,658],[451,127],[810,447],[208,180],[694,115],[783,379],[654,590],[874,346],[630,505],[731,164],[981,828],[637,457],[821,419],[605,314],[824,711],[935,656],[501,403],[220,33],[749,423],[825,74],[851,346],[535,53],[370,210],[732,26],[304,58],[907,48],[861,36],[838,523],[991,34],[918,837],[616,15],[941,212],[338,312],[522,341],[676,436],[460,431],[965,119],[610,425],[740,335],[943,671],[798,438],[982,192],[836,353],[195,81],[700,618],[582,367],[779,691],[625,284],[690,685],[910,379],[794,7],[879,544],[722,5],[558,501],[849,706],[917,892],[771,447],[854,551],[649,635],[813,175],[810,139],[841,15],[922,247],[472,361],[806,776],[929,367],[899,453],[881,108],[816,145],[791,231],[360,268],[220,52],[820,211],[811,805],[866,621],[958,825],[400,262],[756,112],[559,502],[892,614],[956,445],[586,52],[882,227],[753,606],[773,395],[703,354],[505,307],[719,633],[207,181],[605,441],[378,327],[669,566],[77,73],[142,127],[409,194],[559,379],[842,485],[758,339],[764,550],[783,46],[659,231],[862,84],[937,790],[904,437],[810,769],[860,192],[920,674],[499,495],[926,376],[801,680],[859,670],[485,451],[944,871],[248,43],[324,252],[691,185],[438,138],[649,642],[756,84],[871,600],[561,432],[36,4],[634,384],[720,691],[328,174],[819,533],[705,423],[500,101],[393,301],[616,157],[608,157],[532,387],[173,150],[902,680],[843,628],[814,202],[351,174],[590,81],[530,88],[865,32],[981,540],[978,364],[227,192],[862,146],[949,907],[950,571],[321,139],[797,501],[102,30],[589,131],[488,226],[645,565],[938,839],[834,110],[998,457],[720,440],[970,763],[827,274],[874,803],[595,585],[791,429],[479,469],[624,332],[992,284],[400,342],[913,467],[907,496],[717,370],[636,160],[796,584],[358,281],[892,567],[555,531],[701,233],[419,182],[382,352],[528,195],[441,314],[251,13],[801,76],[983,266],[931,120],[200,80],[703,540],[410,128],[991,766],[928,438],[938,888],[898,592],[569,117],[948,579],[932,452],[549,442],[814,490],[916,401],[556,519],[689,652],[352,253],[322,34],[403,39],[489,84],[807,724],[539,153],[369,249],[782,205],[386,75],[850,256],[929,766],[822,143],[997,141],[928,282],[802,423],[896,520],[364,225],[927,194],[548,317],[951,644],[783,77],[433,211],[453,301],[372,197],[840,680],[663,392],[690,207],[733,6],[927,485],[490,140],[947,946],[228,206],[934,705],[170,23],[980,480],[829,70],[455,118],[652,569],[616,509],[527,387],[619,190],[596,193],[346,78],[693,519],[978,344],[665,98],[999,135],[960,959],[991,647],[185,113],[784,715],[331,281],[707,53],[478,363],[925,837],[561,356],[365,123],[375,330],[933,864],[338,51],[967,837],[621,246],[579,517],[738,686],[709,61],[911,672],[238,94],[234,43],[623,473],[552,521],[464,366],[856,336],[574,180],[675,493],[732,175],[594,22],[425,116],[965,22],[575,210],[360,353],[206,178],[273,221],[673,117],[565,527],[896,6],[589,352],[543,536],[528,347],[847,445],[868,657],[420,188],[894,73],[793,16],[733,88],[166,18],[914,356],[803,468],[973,451],[775,732],[493,92],[411,240],[789,288],[219,34],[292,102],[564,165],[873,311],[678,367],[277,124],[861,569],[548,35],[288,40],[439,365],[957,296],[476,437],[365,145],[711,131],[767,269],[794,135],[332,38],[792,624],[970,79],[762,657],[982,243],[982,36],[245,167],[729,75],[849,705],[793,363],[793,630],[352,202],[560,143],[887,739],[588,97],[987,792],[644,536],[986,287],[960,442],[330,135],[982,366],[396,341],[585,220],[584,250],[868,297],[695,111],[828,803],[371,84],[969,307],[857,726],[938,434],[580,359],[945,147],[634,36],[950,911],[315,181],[325,175],[769,361],[751,356],[606,477],[593,449],[359,9],[862,4],[237,17],[461,17],[720,563],[372,35],[422,218],[422,104],[997,165],[876,46],[927,495],[818,590],[28,19],[451,38],[325,87],[895,638],[763,716],[937,350],[720,308],[964,82],[779,334],[377,61],[241,78],[945,927],[991,10],[850,785],[690,165],[134,65],[117,82],[925,541],[779,706],[735,95],[555,224],[975,606],[797,522],[438,244],[885,511],[848,309],[872,207],[971,410],[409,54],[490,339],[895,350],[712,188],[922,564],[605,120],[449,390],[647,81],[899,672],[563,438],[578,271],[690,274],[678,433],[859,809],[958,627],[603,59],[728,360],[760,534],[859,142],[659,339],[494,290],[984,328],[610,184],[890,11],[629,358],[885,832],[519,440],[881,879],[607,165],[394,386],[803,469],[914,449],[407,57],[797,300],[735,89],[922,438],[976,546],[675,147],[477,145],[870,866],[904,706],[640,195],[730,296],[985,475],[656,576],[404,179],[817,480],[805,716],[479,164],[979,314],[463,318],[874,176],[959,583],[976,699],[435,189],[933,568],[681,667],[720,187],[347,324],[427,369],[863,512],[763,666],[641,142],[733,253],[809,86],[801,671],[794,313],[445,19],[433,65],[578,530],[501,291],[292,187],[552,198],[920,421],[948,10],[431,172],[841,664],[377,341],[821,679],[855,840],[997,652],[983,979],[326,142],[982,22],[623,450],[326,229],[448,59],[916,769],[662,618],[737,62],[993,861],[459,458],[848,440],[287,95],[879,442],[913,220],[848,729],[503,128],[410,131],[138,5],[839,78],[411,110],[644,612],[920,269],[606,360],[505,399],[433,374],[996,929],[836,256],[930,866],[871,358],[830,643],[220,132],[782,20],[922,357],[682,670],[629,361],[357,210],[359,190],[861,44],[938,345],[431,360],[745,645],[852,230],[853,177],[558,452],[198,171],[709,702],[406,165],[711,19],[389,236],[447,58],[904,269],[258,209],[821,307],[435,378],[274,42],[651,642],[872,631],[937,112],[479,352],[463,143],[960,780],[888,429],[969,335],[975,126],[859,841],[942,349],[824,119],[552,88],[226,15],[958,75],[789,479],[649,515],[666,487],[641,207],[450,368],[664,653],[837,246],[827,792],[517,248],[122,58],[424,281],[822,325],[614,406],[835,425],[722,134],[350,37],[413,200],[934,8],[565,468],[418,105],[972,216],[966,124],[654,78],[119,0],[727,475],[866,591],[382,110],[750,592],[987,410],[561,262],[791,508],[872,685],[915,809],[968,168],[866,706],[772,405],[316,240],[784,127],[960,530],[813,444],[630,397],[982,615],[621,130],[495,417],[648,162],[835,417],[961,248],[984,488],[992,118],[669,374],[797,640],[640,476],[743,556],[449,337],[813,329],[881,665],[897,747],[664,388],[838,758],[873,565],[711,630],[684,394],[73,34],[897,445],[677,667],[747,657],[653,458],[634,368],[805,348],[263,156],[848,564],[642,186],[760,233],[696,666],[918,753],[661,508],[654,390],[279,48],[838,522],[821,141],[870,231],[860,12],[994,292],[821,592],[879,219],[903,794],[640,611],[846,101],[827,326],[905,66],[130,62],[965,605],[732,261],[284,149],[663,179],[848,296],[569,83],[975,118],[839,516],[531,228],[457,25],[867,773],[272,237],[491,46],[538,66],[804,729],[411,76],[255,238],[834,434],[659,124],[665,127],[499,193],[519,389],[578,131],[386,308],[719,328],[462,110],[791,242],[601,375],[743,284],[883,349],[472,179],[857,497],[788,468],[858,224],[629,510],[692,314],[466,205],[651,35],[706,678],[489,238],[486,114],[628,337],[740,307],[113,56],[629,406],[686,436],[557,390],[915,538],[796,518],[751,472],[550,297],[506,442],[900,63],[537,308],[317,159],[653,579],[886,7],[627,539],[838,642],[735,426],[834,721],[596,528],[902,615],[326,129],[555,545],[596,135],[779,139],[401,70],[973,507],[750,485],[475,317],[716,347],[663,591],[633,624],[190,156],[848,135],[815,705],[975,939],[735,478],[990,853],[694,576],[171,139],[980,430],[965,912],[813,121],[708,340],[283,219],[945,192],[528,142],[292,55],[508,79],[730,138],[644,400],[421,187],[789,765],[467,381],[554,284],[823,544],[936,513],[357,319],[782,187],[707,670],[348,139],[977,892],[610,212],[838,18],[201,93],[190,145],[548,126],[799,146],[714,360],[383,371],[664,96],[501,499],[951,533],[469,434],[831,726],[318,159],[806,607],[490,384],[872,561],[974,39],[667,665],[786,388],[669,178],[257,38],[808,38],[913,338],[876,500],[913,474],[551,158],[818,553],[918,351],[847,765],[706,599],[139,38],[544,66],[880,855],[153,96],[485,17],[247,245],[923,64],[807,307],[832,116],[966,307],[354,297],[939,917],[671,607],[545,192],[604,199],[563,361],[934,669],[347,322],[995,728],[983,907],[685,193],[679,452],[681,342],[943,205],[707,235],[854,546],[798,205],[638,106],[180,134],[339,249],[565,180],[534,289],[613,154],[489,139],[976,650],[815,481],[873,210],[853,846],[100,18],[881,802],[865,31],[648,622],[884,793],[764,481],[527,26],[989,624],[779,491],[726,114],[461,162],[450,222],[721,436],[710,456],[606,539],[736,255],[975,301],[537,223],[792,399],[640,62],[453,44],[489,46],[415,295],[635,634],[268,261],[811,810],[685,221],[242,99],[656,453],[265,169],[161,51],[204,149],[737,103],[943,547],[663,78],[628,342],[429,159],[540,454],[481,278],[630,550],[695,27],[554,323],[625,283],[318,63],[888,210],[639,369],[379,326],[592,46],[945,411],[907,369],[275,237],[692,323],[980,168],[529,319],[237,39],[648,552],[586,316],[158,122],[76,17],[587,36],[602,7],[341,65],[931,875],[709,513],[861,212],[640,453],[560,2],[789,650],[912,799],[596,277],[653,99],[933,36],[549,7],[652,29],[473,93],[975,536],[940,247],[571,188],[569,371],[879,363],[731,699],[355,302],[575,222],[849,242],[892,856],[826,560],[754,337],[417,364],[926,249],[525,47],[760,24],[640,507],[970,830],[678,290],[494,324],[685,350],[986,813],[674,524],[527,167],[677,489],[818,111],[630,227],[356,90],[487,219],[936,817],[969,337],[380,92],[607,175],[416,276],[702,371],[289,147],[888,312],[874,344],[619,522],[878,153],[900,260],[752,444],[745,477],[873,274],[921,130],[618,330],[846,634],[396,135],[784,213],[911,242],[608,544],[987,741],[668,185],[815,763],[787,257],[756,698],[952,676],[955,337],[347,206],[793,438],[791,328],[73,35],[466,338],[459,27],[256,247],[953,724],[556,454],[838,663],[773,729],[929,754],[827,703],[980,776],[365,74],[539,201],[489,11],[524,251],[977,212],[611,490],[722,568],[668,338],[303,1],[217,10],[694,242],[650,273],[557,118],[869,706],[836,11],[582,578],[257,48],[961,183],[652,2],[158,60],[724,361],[805,416],[630,300],[922,650],[529,385],[820,169],[926,837],[424,117],[958,857],[668,1],[651,179],[925,126],[752,81],[370,246],[844,550],[513,89],[918,561],[595,452],[949,618],[681,313],[930,442],[707,494],[890,133],[565,484],[977,166],[944,860],[771,248],[854,195],[245,78],[705,578],[212,194],[737,469],[637,79],[566,1],[478,413],[415,195],[521,55],[806,662],[654,214],[719,519],[86,44],[476,229],[454,224],[798,79],[753,720],[483,348],[984,567],[763,537],[180,11],[930,303],[418,40],[990,571],[686,217],[226,169],[755,542],[830,424],[978,368],[653,181],[411,209],[581,160],[697,282],[775,478],[164,132],[936,42],[422,76],[536,527],[832,139],[791,333],[746,373],[803,229],[946,860],[836,306],[379,8],[458,413],[686,575],[568,499],[911,607],[713,169],[774,608],[879,223],[621,490],[437,216],[743,509],[675,177],[397,159],[711,421],[830,774],[935,1],[863,181],[849,704],[795,492],[768,691],[814,580],[801,349],[465,272],[964,751],[974,510],[879,404],[816,724],[630,229],[667,513],[239,131],[605,228],[492,218],[678,572],[975,901],[800,515],[905,502],[750,603],[650,51],[36,2],[673,82],[903,597],[928,81],[474,2],[310,74],[624,281],[697,98],[684,155],[819,193],[853,389],[692,410],[900,384],[249,41],[611,133],[423,22],[956,590],[229,9],[218,54],[247,74],[968,419],[967,248],[999,10],[748,59],[951,679],[982,862],[869,144],[998,608],[773,656],[734,16],[860,247],[837,580],[150,92],[735,297],[197,70],[420,219],[397,274],[345,113],[896,356],[686,246],[854,166],[621,38],[966,44],[998,694],[831,582],[843,585],[648,42],[727,541],[838,289],[492,390],[941,835],[779,688],[607,203],[427,243],[255,152],[818,311],[615,322],[594,324],[568,247],[554,293],[642,153],[940,369],[668,173],[498,133],[827,104],[439,381],[771,389],[954,93],[711,477],[495,137],[707,261],[743,514],[609,579],[868,152],[624,449],[906,214],[780,379],[496,267],[883,98],[682,28],[862,471],[101,88],[671,363],[924,917],[916,879],[996,573],[989,75],[942,520],[762,693],[884,710],[697,575],[994,140],[816,651],[642,531],[410,337],[220,6],[849,584],[707,515],[407,246],[798,43],[376,169],[387,312],[836,182],[461,235],[521,280],[810,446],[645,440],[528,70],[790,331],[874,653],[914,562],[473,276],[690,658],[735,86],[726,150],[144,55],[638,417],[742,407],[619,516],[292,229],[486,59],[838,482],[487,394],[347,32],[655,127],[890,319],[698,471],[838,179],[362,314],[997,947],[819,297],[936,250],[894,116],[686,376],[967,4],[985,268],[447,352],[996,327],[552,349],[660,568],[323,274],[363,164],[698,100],[480,21],[938,650],[631,531],[490,230],[361,57],[527,329],[653,546],[994,748],[505,146],[316,190],[971,233],[737,156],[587,66],[703,469],[999,249],[511,323],[192,35],[687,445],[811,553],[626,106],[810,415],[77,34],[934,760],[994,125],[454,425],[326,43],[524,73],[899,564],[806,311],[594,415],[774,476],[426,31],[979,205],[814,18],[980,489],[745,233],[398,173],[931,532],[869,90],[641,295],[946,649],[806,207],[277,215],[824,59],[965,342],[967,414],[574,361],[945,619],[770,521],[679,213],[924,556],[952,90],[682,311],[538,471],[563,359],[754,527],[799,31],[931,18],[654,579],[990,311],[925,57],[827,196],[394,34],[841,346],[756,264],[367,157],[718,689],[653,391],[901,51],[411,161],[253,200],[805,373],[693,404],[694,482],[440,11],[200,88],[580,336],[944,668],[731,472],[741,95],[310,175],[771,486],[789,700],[630,254],[761,466],[684,332],[540,5],[608,211],[489,351],[899,330],[694,691],[699,277],[995,101],[998,383],[605,10],[592,182],[915,96],[437,32],[773,6],[733,500],[623,530],[108,98],[341,64],[840,432],[945,465],[168,29],[898,851],[411,206],[316,139],[679,224],[470,2],[872,99],[485,454],[966,167],[557,95],[991,533],[581,373],[932,599],[885,870],[939,468],[895,636],[581,441],[171,84],[46,35],[467,136],[886,335],[870,173],[680,452],[714,299],[979,113],[785,683],[713,604],[614,153],[697,27],[979,705],[418,118],[611,37],[285,180],[933,731],[457,410],[311,51],[701,8],[386,66],[335,157],[466,149],[644,497],[895,478],[668,143],[959,393],[449,179],[438,371],[386,133],[331,275],[361,226],[908,765],[855,433],[734,414],[477,319],[817,752],[711,84],[536,54],[528,459],[412,269],[757,667],[744,158],[838,361],[498,300],[369,171],[694,117],[651,46],[994,864],[979,763],[201,104],[381,125],[780,599],[644,535],[389,306],[898,206],[969,893],[223,207],[185,116],[390,150],[239,224],[264,204],[799,501],[679,231],[781,5],[548,27],[601,21],[724,669],[304,35],[529,28],[719,386],[986,301],[965,757],[886,302],[585,88],[870,162],[291,204],[633,487],[909,176],[707,73],[764,1],[646,444],[841,224],[673,333],[764,121],[280,216],[735,234],[905,371],[559,273],[438,151],[748,152],[675,509],[897,668],[506,371],[541,314],[598,565],[200,67],[231,154],[946,95],[481,1],[616,614],[736,34],[795,573],[548,185],[910,17],[964,327],[537,510],[564,286],[979,865],[815,647],[740,559],[901,67],[897,881],[976,333],[946,677],[864,798],[958,154],[891,274],[771,603],[870,764],[175,5],[967,572],[637,623],[103,39],[873,730],[135,111],[730,729],[914,214],[751,92],[978,825],[884,778],[639,204],[997,488],[967,499],[812,27],[762,274],[838,319],[958,153],[809,214],[832,735],[567,86],[366,359],[867,459],[408,344],[587,61],[591,376],[586,352],[471,94],[973,17],[575,535],[844,570],[398,130],[839,196],[749,108],[848,832],[620,215],[395,107],[808,699],[972,756],[947,436],[793,612],[711,629],[901,38],[730,581],[936,142],[793,506],[933,542],[909,880],[727,613],[589,209],[289,197],[556,131],[678,458],[849,194],[727,455],[991,75],[932,628],[558,161],[680,409],[891,367],[742,48],[823,250],[963,427],[884,497],[895,156],[345,321],[486,151],[919,876],[523,427],[594,258],[405,300],[786,146],[633,317],[947,356],[953,271],[718,532],[532,337],[390,119],[580,227],[368,241],[620,280],[211,62],[651,195],[707,356],[787,173],[516,180],[345,305],[526,410],[688,247],[145,103],[198,105],[469,393],[791,467],[694,458],[459,110],[485,477],[739,214],[450,214],[897,228],[736,287],[585,451],[150,2],[881,258],[392,189],[870,562],[789,669],[642,541],[710,684],[959,275],[699,573],[492,425],[628,492],[987,886],[880,15],[483,119],[470,97],[882,29],[593,251],[492,157],[558,352],[994,676],[672,563],[296,70],[513,154],[927,150],[239,32],[852,134],[457,285],[691,677],[565,503],[614,610],[649,637],[214,44],[295,216],[627,376],[798,437],[674,305],[892,12],[319,149],[262,105],[453,445],[842,725],[905,9],[473,76],[847,487],[869,498],[682,471],[587,114],[905,20],[877,240],[830,317],[718,698],[959,803],[518,424],[110,31],[764,324],[781,582],[544,361],[837,172],[921,286],[857,186],[649,256],[399,366],[843,467],[969,921],[722,701],[708,291],[904,245],[552,372],[645,319],[780,238],[936,84],[175,80],[910,871],[601,63],[895,498],[914,749],[777,154],[571,241],[521,308],[776,700],[583,566],[305,208],[799,437],[808,747],[798,256],[789,162],[446,275],[858,350],[330,18],[582,262],[931,880],[615,389],[896,804],[696,168],[694,208],[798,408],[788,340],[339,24],[381,348],[541,341],[502,495],[555,315],[942,733],[454,288],[650,582],[914,844],[741,696],[341,60],[925,245],[786,421],[617,422],[941,328],[246,108],[874,802],[275,107],[997,533],[320,286],[778,710],[477,419],[301,26],[490,201],[135,65],[578,386],[672,414],[154,105],[608,387],[441,396],[881,260],[436,129],[128,10],[989,204],[657,265],[908,462],[898,820],[408,302],[620,434],[291,42],[641,391],[733,351],[969,290],[303,238],[593,463],[783,415],[846,840],[244,163],[989,142],[449,214],[581,295],[981,806],[977,9],[977,351],[877,390],[866,679],[728,5],[651,586],[753,508],[849,828],[794,388],[39,35],[586,495],[994,438],[704,45],[212,196],[637,347],[869,310],[920,68],[628,329],[776,501],[774,175],[148,94],[604,60],[304,299],[906,491],[343,303],[541,323],[852,485],[445,163],[512,496],[864,197],[928,319],[562,151],[742,579],[743,657],[667,453],[783,531],[185,97],[796,23],[929,598],[631,510],[654,422],[995,809],[949,193],[552,41],[231,179],[820,135],[52,26],[778,748],[940,100],[176,163],[936,10],[720,193],[949,507],[363,182],[885,429],[952,750],[596,140],[943,545],[846,278],[992,961],[988,503],[845,12],[530,213],[903,900],[976,147],[699,9],[561,450],[506,45],[538,473],[804,599],[928,161],[789,460],[698,333],[616,204],[926,161],[717,146],[897,362],[824,361],[662,288],[541,80],[864,846],[475,228],[362,180],[795,292],[860,525],[772,194],[353,182],[896,639],[869,736],[780,469],[142,98],[213,29],[773,93],[463,285],[882,68],[692,536],[883,514],[98,49],[641,363],[444,368],[468,225],[867,650],[664,223],[920,836],[230,50],[587,517],[920,445],[313,1],[778,649],[425,362],[741,536],[801,714],[628,324],[216,183],[372,93],[757,191],[894,92],[544,243],[536,270],[904,741],[908,490],[906,373],[327,137],[679,203],[753,137],[939,483],[463,192],[644,397],[992,989],[944,92],[412,20],[909,653],[832,699],[340,198],[663,555],[961,593],[827,246],[788,122],[10,0],[678,55],[920,202],[855,139],[590,69],[973,716],[703,667],[306,168],[540,94],[765,732],[180,163],[384,184],[744,564],[804,51],[298,132],[230,134],[640,359],[823,744],[764,349],[436,410],[337,185],[922,92],[155,88],[945,626],[291,153],[881,207],[506,78],[634,29],[460,21],[505,417],[773,199],[426,384],[445,251],[850,278],[761,729],[742,668],[396,233],[899,859],[715,285],[175,68],[731,524],[915,430],[311,292],[815,603],[986,831],[916,716],[898,689],[842,21],[915,176],[576,469],[876,235],[797,470],[859,50],[713,386],[542,509],[944,767],[851,81],[680,531],[976,336],[981,167],[967,409],[735,447],[321,259],[530,327],[495,33],[576,227],[749,337],[531,146],[580,174],[993,298],[908,829],[902,163],[748,294],[672,362],[881,630],[784,641],[836,810],[810,473],[263,79],[883,552],[894,878],[915,71],[541,119],[594,144],[710,682],[478,383],[744,510],[647,570],[983,523],[992,418],[948,275],[887,569],[923,304],[844,683],[245,61],[417,338],[937,12],[920,721],[815,443],[589,138],[662,348],[709,559],[595,372],[728,63],[592,439],[677,664],[802,348],[414,31],[597,254],[721,453],[840,590],[610,403],[839,177],[856,280],[803,590],[470,146],[589,514],[915,802],[898,882],[609,390],[677,553],[721,259],[833,96],[774,295],[583,65],[698,248],[684,194],[687,211],[229,115],[295,147],[306,173],[959,779],[678,566],[711,200],[878,843],[425,241],[235,94],[688,328],[288,41],[809,151],[701,587],[749,207],[834,555],[443,216],[843,673],[620,599],[965,959],[121,101],[829,203],[988,499],[828,314],[593,539],[543,394],[853,485],[61,53],[346,55],[869,509],[496,2],[440,146],[839,542],[844,502],[841,93],[940,527],[532,167],[632,457],[977,683],[966,425],[767,47],[785,721],[254,109],[968,593],[340,137],[119,97],[943,719],[636,127],[778,208],[810,494],[684,9],[863,318],[196,23],[786,469],[619,605],[345,101],[527,442],[954,259],[954,810],[825,544],[893,183],[770,540],[861,326],[680,249],[337,215],[914,147],[244,50],[480,338],[889,36],[780,303],[858,493],[502,372],[305,82],[460,144],[836,400],[798,247],[969,34],[741,412],[196,34],[987,927],[640,180],[573,86],[989,41],[343,11],[592,378],[976,910],[697,95],[823,301],[288,35],[697,362],[880,234],[594,260],[955,327],[595,196],[408,65],[649,641],[745,610],[731,275],[949,482],[310,121],[812,208],[654,95],[486,182],[826,115],[683,547],[621,403],[823,380],[624,533],[202,162],[808,762],[380,301],[378,366],[549,487],[958,346],[914,181],[286,61],[803,44],[703,234],[997,282],[935,833],[903,739],[484,347],[373,369],[945,687],[928,156],[749,170],[817,686],[787,753],[506,481],[388,173],[950,738],[619,494],[732,286],[580,348],[767,427],[601,280],[538,13],[515,184],[912,116],[208,0],[702,481],[904,164],[121,91],[303,208],[870,769],[817,146],[728,118],[911,714],[890,609],[493,484],[970,412],[338,148],[736,266],[720,505],[748,117],[887,254],[609,566],[949,612],[694,274],[833,684],[399,87],[780,769],[946,453],[783,487],[366,221],[398,0],[489,410],[728,634],[852,53],[367,361],[717,221],[322,32],[718,623],[443,76],[779,199],[841,780],[689,385],[650,352],[223,129],[954,312],[886,551],[689,196],[354,26],[450,432],[513,223],[546,40],[987,167],[917,770],[645,274],[738,55],[416,390],[364,262],[983,897],[932,39],[908,195],[600,177],[731,484],[425,89],[703,309],[857,203],[381,93],[28,20],[409,146],[838,127],[599,488],[909,109],[782,567],[982,85],[325,185],[921,682],[317,270],[891,487],[153,12],[739,287],[701,9],[946,823],[948,395],[914,284],[513,24],[372,52],[482,247],[818,582],[657,360],[556,200],[755,256],[741,568],[722,534],[481,336],[629,478],[907,350],[834,12],[593,29],[267,237],[899,862],[620,419],[767,444],[850,737],[850,673],[684,110],[660,261],[958,262],[206,23],[204,142],[804,396],[471,174],[882,78],[416,210],[68,55],[412,326],[728,369],[552,15],[581,133],[657,325],[854,218],[910,630],[958,862],[140,8],[985,679],[943,138],[709,191],[388,75],[715,708],[853,488],[881,659],[900,838],[855,369],[712,230],[908,564],[949,359],[397,251],[842,51],[496,36],[800,740],[955,435],[871,281],[703,185],[655,224],[834,490],[184,36],[592,173],[966,753],[780,742],[701,497],[998,315],[818,376],[650,607],[195,146],[745,703],[228,227],[184,25],[991,774],[751,380],[531,52],[698,524],[977,752],[463,98],[804,60],[924,906],[285,22],[954,537],[758,701],[688,359],[462,375],[816,165],[689,123],[620,244],[908,876],[195,182],[786,360],[787,502],[833,784],[666,28],[850,269],[865,616],[771,536],[856,444],[732,715],[581,229],[944,50],[866,551],[840,526],[984,472],[467,124],[698,312],[925,599],[937,536],[897,79],[976,833],[748,15],[786,83],[434,433],[911,471],[668,535],[813,780],[902,779],[746,338],[943,437],[994,895],[538,464],[671,528],[383,86],[726,179],[191,98],[401,286],[783,483],[814,117],[357,9],[740,146],[796,327],[880,432],[903,637],[884,138],[331,288],[545,10],[473,297],[533,110],[924,83],[569,224],[711,326],[327,252],[141,82],[786,328],[406,268],[553,121],[648,240],[971,878],[930,530],[707,529],[905,802],[588,539],[690,33],[780,568],[840,714],[679,70],[907,563],[400,359],[916,90],[889,284],[756,10],[553,199],[633,413],[933,77],[427,104],[472,177],[977,675],[980,304],[200,35],[392,352],[712,614],[565,114],[957,630],[484,185],[574,528],[487,391],[793,541],[863,635],[289,117],[396,31],[901,547],[813,32],[454,326],[572,176],[739,678],[341,25],[529,514],[529,191],[550,158],[940,235],[766,107],[588,229],[800,555],[822,367],[872,33],[426,255],[847,352],[915,199],[427,342],[379,282],[760,643],[332,241],[635,33],[929,300],[353,36],[373,68],[521,272],[894,556],[811,329],[589,359],[278,165],[953,617],[978,24],[442,111],[967,61],[705,227],[765,589],[831,692],[404,296],[715,659],[727,299],[814,188],[594,562],[710,281],[977,42],[930,619],[472,458],[868,542],[965,801],[694,152],[925,784],[565,521],[850,101],[689,581],[808,531],[777,666],[841,824],[494,350],[506,49],[823,188],[364,252],[387,193],[125,60],[825,531],[292,281],[844,536],[393,157],[680,286],[98,85],[895,851],[538,144],[704,136],[802,523],[943,740],[604,233],[851,547],[673,482],[922,823],[583,436],[565,383],[515,388],[894,877],[724,485],[719,126],[865,681],[227,54],[777,194],[481,367],[734,207],[978,794],[776,266],[298,207],[846,670],[670,323],[803,345],[840,493],[879,107],[631,291],[784,320],[709,470],[79,7],[740,206],[359,56],[36,34],[804,196],[109,88],[961,434],[934,242],[726,438],[238,148],[874,779],[552,234],[858,163],[369,316],[953,608],[921,761],[244,218],[811,768],[617,344],[815,424],[956,850],[107,55],[847,335],[677,133],[467,337],[611,245],[557,146],[304,74],[363,187],[415,46],[542,439],[276,17],[808,463],[487,463],[895,682],[697,516],[882,96],[744,63],[974,474],[189,89],[445,45],[915,47],[898,156],[706,141],[970,569],[988,313],[972,179],[165,97],[319,209],[680,236],[472,350],[810,443],[356,64],[861,71],[454,290],[729,361],[874,700],[552,182],[635,148],[998,391],[217,116],[741,270],[950,694],[565,360],[861,846],[875,469],[975,701],[711,367],[610,203],[943,870],[963,668],[462,260],[928,91],[367,137],[975,826],[910,551],[844,165],[811,367],[207,122],[614,292],[767,683],[419,293],[965,284],[815,177],[261,37],[829,214],[967,954],[570,329],[252,27],[915,697],[734,565],[865,447],[347,20],[793,456],[696,527],[862,67],[786,178],[673,177],[835,302],[587,437],[978,504],[375,278],[556,445],[994,581],[588,256],[683,315],[553,346],[762,523],[518,218],[613,275],[818,394],[390,126],[400,76],[888,194],[739,235],[814,374],[935,666],[180,173],[784,331],[420,164],[996,609],[757,311],[792,393],[912,295],[979,827],[502,469],[848,783],[994,564],[979,946],[609,444],[812,700],[897,726],[866,432],[396,238],[347,54],[388,307],[869,721],[695,485],[876,151],[670,123],[270,247],[857,788],[511,280],[777,477],[960,430],[896,428],[689,307],[425,157],[543,195],[694,184],[939,363],[580,401],[121,43],[577,254],[782,42],[914,251],[839,558],[710,572],[997,423],[519,453],[356,98],[513,74],[618,233],[794,466],[647,88],[764,303],[579,278],[751,121],[753,712],[894,416],[950,211],[588,529],[776,172],[819,230],[560,106],[923,833],[456,113],[275,95],[562,21],[940,236],[769,556],[595,220],[300,88],[130,37],[998,168],[967,252],[529,282],[718,159],[149,132],[445,116],[898,257],[945,781],[700,385],[285,270],[219,174],[932,365],[870,471],[628,416],[529,67],[845,769],[805,372],[583,136],[791,183],[774,636],[751,652],[984,404],[522,43],[574,398],[697,687],[152,118],[780,110],[930,158],[653,278],[919,904],[734,733],[801,683],[454,414],[997,390],[409,346],[668,26],[898,540],[954,703],[998,372],[748,235],[897,279],[406,38],[975,486],[725,441],[634,89],[699,305],[857,518],[921,215],[297,281],[805,730],[721,473],[260,216],[919,888],[815,759],[853,732],[646,534],[766,518],[998,332],[519,188],[853,405],[702,580],[976,935],[981,41],[978,572],[581,354],[180,83],[648,369],[822,729],[452,33],[734,502],[987,172],[961,111],[396,249],[655,608],[861,164],[765,366],[539,442],[393,354],[890,884],[236,93],[537,97],[387,28],[704,80],[978,118],[873,23],[669,258],[319,306],[666,280],[730,25],[945,169],[457,322],[404,201],[821,305],[926,496],[894,244],[898,589],[421,296],[147,101],[745,189],[995,249],[607,78],[997,942],[898,279],[731,4],[439,236],[220,169],[635,440],[622,139],[375,38],[812,157],[955,366],[828,36],[603,250],[417,270],[385,322],[500,215],[951,919],[738,684],[218,187],[965,264],[822,601],[958,8],[320,259],[960,400],[465,450],[706,297],[310,238],[285,282],[975,765],[793,658],[590,10],[601,413],[664,200],[416,50],[584,324],[695,442],[514,163],[522,279],[529,165],[880,252],[519,302],[484,411],[896,146],[899,482],[274,221],[936,629],[639,240],[999,773],[960,443],[675,485],[854,383],[993,6],[686,568],[63,8],[359,114],[106,104],[906,529],[768,642],[993,842],[625,160],[374,197],[837,665],[729,375],[780,269],[970,880],[304,25],[968,489],[972,600],[765,120],[365,326],[418,394],[980,189],[965,50],[882,171],[751,306],[596,430],[801,749],[995,107],[620,63],[487,453],[734,280],[783,480],[215,112],[922,590],[455,231],[340,24],[651,104],[904,510],[654,461],[778,230],[511,292],[737,66],[111,67],[574,428],[664,527],[944,352],[631,620],[410,59],[601,12],[768,479],[396,150],[960,496],[606,390],[807,728],[526,181],[904,632],[868,179],[671,30],[464,215],[815,774],[298,121],[530,149],[794,402],[869,432],[759,90],[531,509],[699,70],[461,350],[743,557],[814,588],[681,237],[857,148],[313,251],[382,145],[927,475],[558,135],[997,187],[290,235],[736,279],[447,231],[741,14],[864,208],[660,241],[658,234],[774,223],[685,7],[899,217],[796,230],[707,635],[471,268],[750,602],[372,251],[293,102],[813,543],[481,377],[859,797],[906,743],[615,353],[429,377],[876,1],[521,369],[994,607],[573,227],[584,263],[969,654],[494,148],[463,195],[924,102],[637,117],[780,600],[761,83],[485,317],[695,293],[500,347],[674,534],[778,271],[537,396],[379,300],[667,261],[998,836],[148,14],[841,344],[578,180],[332,196],[928,311],[752,495],[821,671],[349,27],[154,86],[864,811],[753,47],[699,604],[890,25],[918,301],[968,769],[676,206],[830,633],[164,40],[583,335],[777,377],[832,351],[198,36],[471,252],[249,217],[871,140],[574,520],[842,823],[426,267],[101,60],[897,545],[757,395],[434,267],[869,450],[718,136],[411,14],[755,259],[228,70],[986,708],[987,119],[958,773],[931,371],[696,104],[720,247],[990,671],[885,349],[366,155],[786,584],[658,623],[863,712],[952,924],[894,298],[651,366],[860,712],[677,96],[783,770],[910,97],[685,65],[499,381],[813,783],[529,393],[776,497],[750,78],[306,250],[865,168],[552,355],[865,762],[943,886],[655,94],[565,500],[879,372],[857,127],[580,449],[814,62],[255,38],[654,330],[187,70],[224,202],[886,275],[765,87],[847,357],[895,693],[381,31],[462,263],[863,442],[845,167],[703,489],[815,126],[952,120],[649,533],[954,828],[790,771],[462,204],[790,395],[764,559],[352,269],[441,82],[975,719],[333,205],[604,293],[945,38],[630,273],[956,83],[144,52],[913,368],[985,659],[444,123],[611,75],[915,513],[710,520],[929,471],[739,468],[757,703],[87,59],[969,480],[611,305],[123,99],[817,543],[385,325],[506,315],[426,274],[593,198],[591,366],[132,35],[517,405],[338,285],[660,594],[819,766],[868,666],[904,327],[739,619],[878,541],[543,445],[760,467],[736,252],[356,225],[387,289],[427,400],[864,542],[694,352],[514,404],[895,127],[689,305],[388,203],[976,264],[638,454],[596,547],[467,414],[555,388],[906,230],[879,678],[938,584],[889,584],[544,321],[883,802],[988,333],[181,115],[990,663],[380,122],[549,303],[470,347],[311,14],[847,229],[998,780],[129,109],[611,198],[952,542],[458,406],[696,148],[629,54],[769,648],[418,151],[707,295],[928,697],[795,25],[796,149],[752,18],[277,229],[907,540],[789,58],[660,393],[650,257],[906,720],[888,519],[709,19],[241,77],[31,10],[388,71],[462,288],[915,557],[943,889],[201,44],[925,14],[458,63],[271,110],[369,335],[549,393],[805,237],[839,357],[648,382],[162,158],[896,662],[953,845],[699,270],[804,660],[651,412],[693,90],[889,608],[853,555],[862,257],[151,133],[825,661],[334,255],[946,365],[855,621],[570,160],[980,467],[604,14],[591,274],[890,249],[872,614],[435,312],[734,707],[864,45],[337,248],[294,88],[690,469],[704,322],[792,572],[887,17],[947,259],[550,543],[919,453],[307,245],[635,137],[850,729],[798,24],[515,279],[684,670],[986,484],[570,511],[294,132],[549,36],[945,765],[292,184],[920,346],[960,922],[395,336],[732,330],[419,126],[717,29],[982,782],[880,241],[995,552],[997,740],[318,54],[721,333],[354,137],[650,181],[954,329],[459,279],[545,249],[297,23],[826,28],[663,553],[624,222],[828,466],[475,335],[905,39],[710,161],[394,133],[726,320],[602,83],[782,46],[647,362],[629,276],[973,832],[636,546],[491,372],[849,35],[480,182],[371,135],[981,90],[691,427],[969,430],[477,460],[725,238],[992,236],[925,822],[791,385],[281,181],[961,546],[616,410],[285,193],[74,1],[988,707],[973,958],[695,298],[344,127],[819,705],[872,214],[908,116],[656,212],[752,318],[464,91],[453,208],[971,397],[540,250],[566,479],[639,154],[262,99],[714,87],[734,73],[726,293],[902,581],[428,204],[388,113],[101,32],[513,28],[362,361],[410,142],[82,54],[890,602],[596,142],[555,351],[856,343],[960,768],[175,127],[910,253],[660,470],[797,510],[856,493],[942,394],[653,602],[62,61],[592,422],[797,466],[910,87],[501,452],[870,184],[804,103],[995,508],[922,600],[869,730],[790,57],[711,592],[213,171],[732,71],[336,153],[859,645],[426,72],[793,33],[451,324],[668,46],[609,265],[980,146],[767,286],[885,71],[816,172],[667,501],[850,438],[957,460],[964,783],[929,705],[496,352],[991,218],[534,428],[782,609],[823,386],[537,468],[326,183],[835,103],[433,328],[593,319],[664,542],[984,365],[98,34],[773,632],[800,518],[236,204],[175,153],[811,546],[597,353],[652,527],[695,609],[777,327],[177,25],[789,299],[966,312],[762,476],[848,93],[698,687],[732,531],[579,89],[727,325],[903,299],[594,509],[945,185],[570,345],[459,304],[321,250],[939,634],[576,529],[681,138],[957,284],[711,512],[665,130],[951,70],[511,355],[578,519],[432,167],[350,235],[709,262],[944,108],[496,462],[893,657],[633,393],[871,531],[672,298],[732,427],[574,185],[871,508],[433,428],[640,621],[891,664],[553,38],[859,557],[850,757],[415,180],[603,82],[581,453],[720,332],[882,846],[294,118],[627,600],[664,277],[745,146],[170,60],[644,549],[975,21],[703,494],[641,167],[934,817],[482,82],[565,430],[986,747],[412,174],[723,229],[223,22],[740,406],[750,217],[873,217],[875,740],[416,61],[183,156],[380,49],[961,655],[430,295],[503,189],[818,629],[726,333],[501,407],[860,727],[642,353],[967,413],[958,524],[356,173],[764,299],[508,386],[704,491],[995,572],[487,173],[564,264],[929,736],[594,262],[639,108],[745,303],[173,113],[634,133],[158,74],[805,630],[932,110],[474,417],[886,299],[779,38],[764,351],[737,190],[825,655],[128,55],[625,373],[648,334],[313,294],[707,596],[918,146],[350,144],[348,257],[256,58],[617,563],[938,856],[574,557],[518,208],[942,893],[255,120],[693,34],[556,476],[921,740],[519,460],[851,544],[873,840],[681,624],[978,404],[953,628],[821,144],[866,410],[168,44],[740,274],[824,517],[773,168],[633,457],[983,422],[567,434],[405,399],[999,854],[716,21],[952,215],[675,79],[530,329],[872,416],[442,287],[893,880],[754,101],[563,56],[422,332],[880,695],[459,405],[334,190],[795,31],[753,724],[702,173],[632,339],[776,461],[877,290],[616,6],[624,148],[297,189],[523,28],[632,49],[986,16],[201,52],[737,9],[779,649],[831,493],[504,385],[369,333],[885,457],[895,72],[964,629],[697,373],[946,893],[488,481],[541,497],[553,349],[983,729],[608,88],[439,193],[629,269],[560,24],[839,352],[557,91],[77,39],[797,533],[790,740],[528,365],[604,425],[974,895],[321,245],[661,244],[939,181],[542,230],[676,644],[989,381],[606,164],[444,334],[478,336],[764,103],[298,267],[669,383],[66,44],[436,236],[956,512],[983,572],[920,90],[268,48],[583,398],[344,40],[392,347],[936,792],[162,157],[991,316],[906,597],[918,456],[845,431],[900,843],[605,262],[729,156],[254,145],[713,507],[337,44],[981,776],[314,249],[940,237],[928,780],[515,317],[453,355],[834,428],[362,176],[804,758],[215,69],[785,155],[836,162],[913,298],[812,704],[841,795],[817,717],[930,112],[474,147],[596,302],[270,81],[935,442],[283,191],[703,526],[225,61],[683,113],[282,263],[869,247],[257,120],[911,849],[651,372],[702,271],[797,634],[816,287],[969,582],[998,387],[777,140],[980,688],[488,98],[293,276],[547,38],[707,151],[651,604],[660,346],[915,235],[873,109],[546,140],[371,124],[903,899],[584,356],[568,286],[541,318],[395,40],[337,206],[943,259],[487,188],[987,805],[467,424],[622,224],[624,307],[167,77],[687,589],[775,331],[418,414],[643,94],[632,559],[610,341],[860,428],[848,82],[977,579],[778,341],[998,563],[950,118],[702,59],[748,510],[761,368],[977,302],[140,65],[513,161],[626,140],[804,316],[940,867],[999,791],[943,807],[842,633],[297,1],[524,450],[876,287],[156,104],[129,79],[354,232],[683,426],[821,511],[941,142],[603,490],[975,36],[989,45],[214,135],[568,163],[461,256],[758,271],[879,163],[863,680],[989,126],[826,162],[870,34],[935,722],[381,136],[819,591],[879,792],[674,380],[747,68],[841,350],[754,665],[822,486],[269,102],[536,11],[672,264],[777,730],[349,270],[795,791],[930,752],[172,106],[876,558],[780,264],[407,214],[876,690],[483,381],[360,29],[303,81],[837,187],[759,148],[602,567],[822,813],[937,9],[318,90],[813,169],[528,95],[952,315],[410,12],[92,44],[791,213],[671,341],[858,355],[543,141],[766,219],[280,224],[676,37],[940,599],[367,104],[777,588],[719,193],[238,58],[17,3],[329,202],[967,385],[734,194],[771,172],[633,24],[722,90],[568,416],[708,431],[930,662],[814,596],[821,608],[716,65],[967,445],[78,67],[714,399],[458,5],[517,464],[794,5],[717,236],[654,323],[460,39],[938,32],[900,599],[396,207],[724,145],[418,219],[377,223],[885,390],[536,291],[529,166],[711,67],[552,507],[879,111],[610,366],[832,506],[472,331],[560,241],[717,238],[729,8],[346,111],[897,797],[871,767],[946,432],[461,90],[774,261],[706,618],[526,377],[289,20],[683,291],[573,32],[684,162],[149,112],[509,102],[538,45],[767,186],[468,81],[517,513],[749,729],[445,181],[891,456],[395,13],[201,103],[790,391],[991,755],[891,333],[945,836],[217,90],[417,69],[886,760],[848,813],[105,57],[861,129],[951,464],[782,190],[423,367],[585,546],[773,251],[492,307],[886,880],[828,555],[674,475],[530,499],[812,16],[719,632],[306,71],[593,457],[631,630],[305,162],[952,570],[869,262],[738,529],[333,104],[577,33],[61,31],[944,286],[876,511],[469,28],[926,753],[589,113],[988,892],[469,12],[176,100],[499,102],[346,319],[761,379],[704,368],[562,363],[672,527],[765,56],[793,173],[962,458],[797,87],[586,526],[327,51],[447,202],[492,324],[225,181],[652,560],[950,198],[248,201],[653,405],[971,311],[326,304],[995,979],[603,316],[590,417],[191,47],[713,566],[629,270],[113,64],[838,366],[806,650],[671,618],[610,118],[489,443],[542,153],[430,265],[853,248],[924,162],[192,69],[544,127],[573,265],[345,153],[768,356],[612,569],[719,338],[914,134],[605,352],[554,361],[827,781],[900,88],[583,431],[677,551],[319,225],[589,326],[775,118],[910,236],[252,225],[376,299],[564,203],[78,33],[368,23],[924,142],[754,312],[896,399],[172,96],[396,116],[932,111],[872,669],[902,272],[944,124],[940,638],[755,336],[183,73],[760,160],[788,660],[361,129],[966,678],[251,6],[462,151],[770,354],[238,8],[766,245],[425,266],[513,315],[967,314],[439,320],[496,135],[874,447],[823,180],[336,213],[382,179],[827,776],[386,134],[807,795],[122,99],[368,269],[682,101],[364,264],[540,277],[837,159],[850,9],[854,30],[449,329],[957,222],[296,183],[841,710],[298,52],[604,268],[954,881],[941,501],[690,147],[766,732],[806,180],[358,325],[341,183],[995,906],[984,874],[747,482],[115,94],[208,141],[325,235],[451,4],[557,375],[973,790],[833,208],[664,321],[215,104],[822,297],[483,479],[989,884],[482,421],[819,90],[794,674],[649,85],[884,439],[525,485],[709,105],[909,108],[793,570],[436,110],[503,197],[743,604],[689,454],[99,62],[346,234],[794,146],[696,476],[915,469],[939,183],[292,37],[715,84],[558,547],[953,533],[117,90],[964,258],[862,654],[945,808],[544,40],[812,77],[811,323],[162,44],[278,263],[204,54],[628,346],[442,387],[965,410],[963,170],[812,100],[927,324],[951,846],[771,581],[979,43],[738,399],[539,4],[930,708],[470,392],[663,606],[773,705],[597,148],[636,430],[620,296],[993,721],[484,395],[751,729],[240,47],[713,401],[918,495],[773,730],[93,79],[614,167],[391,381],[679,612],[580,373],[847,513],[854,104],[837,458],[789,731],[864,350],[465,428],[851,558],[465,290],[845,331],[779,485],[952,131],[629,307],[963,480],[370,177],[825,267],[628,26],[648,578],[213,114],[324,108],[283,174],[774,619],[728,9],[436,217],[954,744],[547,425],[526,20],[606,287],[982,601],[210,17],[911,193],[671,560],[990,691],[799,545],[154,13],[303,194],[958,286],[412,183],[898,13],[251,23],[369,138],[887,216],[941,424],[669,444],[536,2],[724,16],[940,108],[802,325],[935,402],[554,55],[442,286],[600,365],[815,334],[268,169],[914,830],[266,155],[802,705],[347,179],[777,0],[622,19],[478,152],[299,37],[779,302],[750,656],[650,217],[824,442],[616,81],[954,121],[775,285],[952,951],[568,112],[643,228],[583,195],[838,311],[210,178],[991,880],[330,21],[939,295],[213,45],[981,541],[429,188],[952,669],[147,76],[766,260],[942,740],[608,226],[662,550],[884,529],[822,209],[655,201],[502,273],[522,487],[282,98],[956,669],[898,392],[894,745],[557,215],[587,190],[173,97],[778,745],[402,83],[948,219],[936,4],[942,421],[739,574],[728,94],[853,715],[562,89],[813,24],[706,632],[824,710],[858,24],[948,355],[212,146],[924,295],[235,172],[896,273],[983,212],[485,138],[667,639],[824,20],[140,78],[597,72],[989,727],[142,110],[796,56],[790,592],[423,38],[755,50],[940,725],[916,416],[193,70],[776,704],[942,929],[694,497],[369,356],[985,756],[441,307],[951,925],[838,84],[620,164],[733,369],[568,465],[543,395],[953,126],[788,46],[375,280],[643,166],[500,53],[489,286],[775,65],[902,800],[871,113],[802,799],[719,129],[927,679],[303,271],[922,546],[711,695],[736,615],[618,94],[810,332],[956,829],[889,621],[661,126],[855,231],[907,603],[810,572],[724,627],[729,331],[847,255],[954,233],[586,475],[916,383],[586,477],[500,65],[988,46],[937,725],[777,555],[727,37],[395,57],[908,476],[291,267],[925,90],[122,53],[952,937],[961,926],[917,349],[871,536],[777,64],[787,476],[949,895],[803,565],[962,232],[297,71],[618,231],[513,445],[266,101],[607,548],[564,6],[728,237],[850,491],[847,561],[800,347],[674,492],[921,374],[328,71],[816,400],[187,174],[792,203],[220,41],[568,173],[923,484],[729,293],[495,466],[806,527],[175,30],[878,757],[600,182],[307,67],[648,222],[838,761],[901,863],[931,814],[301,170],[611,324],[359,184],[481,229],[975,185],[290,54],[951,796],[996,145],[882,703],[811,795],[293,123],[979,654],[658,630],[768,110],[798,141],[930,84],[797,12],[279,62],[546,8],[588,585],[425,127],[509,304],[772,427],[571,338],[916,882],[662,141],[508,441],[748,720],[907,461],[832,100],[819,764],[591,338],[739,88],[525,338],[963,198],[812,617],[702,99],[543,262],[898,748],[939,272],[938,330],[458,167],[955,790],[816,12],[493,312],[571,205],[987,133],[516,133],[699,684],[231,76],[808,427],[795,122],[942,873],[793,626],[918,738],[734,176],[843,352],[536,181],[411,113],[435,280],[329,54],[627,400],[599,417],[982,911],[757,562],[277,26],[835,432],[723,378],[765,6],[910,117],[519,442],[638,554],[525,332],[797,46],[575,515],[298,19],[942,467],[393,198],[891,471],[953,569],[511,111],[720,338],[972,197],[486,128],[869,538],[713,139],[762,664],[314,297],[942,38],[799,321],[457,237],[364,11],[206,143],[793,306],[881,674],[580,568],[789,42],[312,252],[732,646],[808,745],[559,28],[529,415],[406,279],[764,41],[885,666],[586,289],[992,322],[751,187],[149,42],[338,110],[423,165],[844,362],[715,151],[826,769],[593,40],[863,304],[657,249],[601,385],[415,123],[779,742],[223,71],[699,334],[517,130],[722,666],[491,445],[846,745],[948,256],[614,227],[310,3],[663,205],[929,858],[859,143],[510,449],[613,310],[929,384],[265,226],[319,132],[660,134],[741,188],[842,58],[681,331],[673,556],[825,510],[926,335],[915,500],[560,532],[821,136],[729,645],[642,91],[550,409],[909,751],[697,232],[997,972],[294,76],[602,150],[906,107],[205,147],[611,120],[308,283],[779,173],[999,309],[692,543],[768,44],[420,260],[176,175],[423,158],[682,605],[845,653],[559,177],[989,440],[562,434],[607,307],[694,633],[789,292],[983,378],[775,655],[478,68],[315,271],[711,503],[418,358],[984,181],[266,94],[751,232],[992,461],[116,63],[998,604],[890,480],[875,488],[884,203],[166,41],[994,583],[657,247],[884,839],[639,600],[823,486],[821,155],[525,346],[720,390],[959,391],[276,22],[837,415],[946,67],[720,362],[914,630],[943,71],[890,525],[886,508],[107,12],[924,452],[86,33],[804,693],[936,327],[800,300],[666,596],[984,735],[994,590],[891,43],[643,314],[772,318],[964,575],[792,236],[670,212],[804,118],[793,346],[271,34],[51,48],[540,244],[439,138],[353,147],[209,16],[804,30],[328,86],[454,311],[322,1],[962,585],[660,89],[568,411],[631,537],[580,547],[705,485],[795,151],[206,81],[308,151],[667,96],[731,590],[581,232],[939,686],[884,168],[953,309],[985,681],[365,174],[996,147],[961,35],[670,192],[780,452],[474,398],[958,531],[562,113],[912,323],[658,518],[989,921],[324,131],[807,390],[989,537],[723,120],[572,455],[942,115],[934,644],[672,614],[735,240],[818,585],[90,6],[949,404],[632,591],[954,422],[509,113],[744,657],[405,341],[879,161],[780,385],[743,151],[970,184],[473,306],[735,638],[464,339],[984,177],[871,169],[729,587],[356,80],[968,801],[899,284],[819,306],[493,273],[842,656],[597,106],[771,689],[937,324],[699,25],[975,593],[997,92],[995,620],[256,250],[948,406],[359,106],[487,55],[397,64],[984,463],[506,154],[476,98],[880,728],[483,455],[981,312],[675,559],[714,536],[576,414],[902,736],[981,82],[688,341],[438,419],[632,61],[745,598],[844,638],[922,305],[136,42],[460,363],[388,375],[816,339],[455,2],[599,18],[359,330],[571,520],[733,581],[491,411],[804,753],[586,39],[916,467],[678,220],[820,341],[665,593],[593,500],[784,492],[792,596],[985,358],[285,124],[633,219],[884,310],[158,64],[485,157],[970,205],[411,107],[832,326],[815,810],[600,134],[970,156],[538,438],[775,136],[620,264],[852,692],[985,396],[296,249],[452,404],[462,410],[538,321],[865,229],[517,278],[323,136],[897,293],[703,278],[791,579],[230,28],[748,268],[806,653],[469,107],[641,633],[966,190],[500,122],[402,319],[819,247],[845,777],[888,686],[727,400],[865,8],[582,143],[391,183],[956,42],[650,481],[832,418],[788,753],[621,401],[689,490],[734,699],[267,152],[592,236],[755,647],[857,85],[884,351],[798,513],[574,400],[914,34],[193,63],[754,363],[626,289],[504,221],[798,662],[515,405],[875,3],[531,28],[884,809],[969,849],[323,7],[747,706],[646,181],[598,92],[380,133],[431,326],[215,211],[308,253],[871,707],[438,214],[779,393],[831,815],[842,613],[618,398],[338,167],[786,595],[663,420],[882,808],[797,150],[619,617],[988,838],[590,239],[497,168],[863,200],[707,554],[739,191],[881,420],[817,105],[922,394],[533,394],[716,507],[465,425],[667,362],[642,25],[667,177],[950,500],[364,38],[571,116],[780,12],[910,560],[865,440],[976,341],[489,253],[951,406],[797,110],[690,39],[411,67],[576,442],[878,311],[453,258],[305,274],[819,377],[449,227],[848,50],[621,85],[402,248],[671,407],[454,175],[432,179],[928,726],[622,620],[988,204],[848,489],[586,28],[763,117],[889,431],[919,105],[778,626],[987,99],[293,169],[844,305],[33,9],[314,156],[239,77],[937,530],[927,871],[949,64],[888,107],[905,421],[792,452],[252,235],[290,78],[797,350],[796,297],[400,216],[727,435],[535,148],[707,375],[759,313],[766,637],[808,465],[697,649],[338,336],[279,117],[752,176],[491,199],[463,343],[788,462],[977,678],[881,256],[863,300],[956,485],[993,92],[657,334],[895,187],[688,675],[959,591],[925,402],[499,77],[698,2],[560,517],[143,38],[513,390],[862,54],[472,380],[909,300],[516,432],[364,26],[737,164],[688,614],[712,40],[724,18],[705,669],[997,443],[472,2],[798,1],[542,466],[758,259],[929,87],[532,104],[980,664],[564,399],[538,121],[741,229],[952,829],[398,360],[596,114],[883,848],[549,271],[775,685],[798,413],[554,119],[399,345],[785,662],[740,221],[821,812],[839,582],[947,602],[708,303],[734,136],[473,402],[844,774],[624,57],[663,181],[913,483],[892,542],[979,656],[532,67],[629,520],[704,79],[817,36],[888,71],[657,572],[236,8],[508,372],[521,206],[637,332],[757,165],[251,64],[650,340],[961,153],[386,219],[450,123],[102,56],[711,524],[299,206],[886,195],[534,514],[977,812],[950,90],[897,507],[398,163],[531,263],[983,93],[209,145],[678,319],[482,418],[421,397],[655,280],[653,430],[243,67],[731,137],[331,72],[188,148],[493,374],[921,711],[670,303],[724,258],[851,443],[994,40],[745,99],[585,421],[224,69],[354,314],[185,35],[572,87],[682,453],[697,646],[808,399],[560,191],[817,384],[475,461],[913,147],[930,488],[870,245],[968,614],[873,113],[543,14],[929,733],[987,143],[476,215],[637,327],[682,436],[277,256],[662,394],[900,869],[427,192],[162,76],[840,285],[432,272],[866,194],[578,391],[402,220],[786,6],[598,438],[930,364],[920,619],[458,77],[329,182],[919,141],[96,20],[174,115],[645,196],[253,175],[797,520],[997,557],[662,96],[618,211],[413,221],[668,387],[310,78],[660,576],[428,427],[115,101],[918,634],[675,134],[640,75],[480,87],[930,577],[752,623],[544,212],[192,124],[815,589],[518,29],[903,146],[372,0],[763,304],[440,117],[563,136],[672,76],[910,904],[874,586],[601,232],[987,442],[941,323],[405,303],[167,25],[757,543],[774,699],[605,358],[635,35],[272,205],[985,602],[758,616],[745,115],[751,671],[718,164],[808,613],[201,194],[884,218],[413,250],[515,235],[244,153],[401,88],[718,674],[713,21],[876,19],[476,466],[812,107],[671,497],[230,158],[736,104],[824,258],[230,26],[330,108],[954,642],[986,355],[853,163],[367,188],[330,274],[379,1],[79,52],[545,483],[395,141],[224,112],[553,357],[632,231],[784,136],[907,4],[600,9],[779,233],[995,57],[692,641],[781,122],[845,631],[811,538],[820,723],[729,240],[180,30],[632,172],[861,144],[883,872],[934,42],[839,719],[938,651],[917,720],[929,234],[628,246],[305,72],[378,133],[666,363],[723,275],[472,86],[425,422],[715,149],[535,291],[196,120],[747,381],[302,154],[760,677],[863,808],[918,608],[358,332],[595,99],[653,351],[553,540],[929,859],[975,415],[180,117],[769,562],[454,169],[540,60],[563,98],[934,52],[526,89],[404,389],[441,432],[73,31],[76,43],[648,187],[916,172],[271,185],[395,149],[988,309],[186,102],[751,656],[621,436],[823,550],[754,516],[555,49],[231,49],[491,324],[736,253],[457,119],[618,214],[525,238],[996,204],[481,20],[695,655],[490,86],[969,108],[720,648],[979,454],[983,367],[188,72],[106,43],[702,248],[732,394],[417,164],[928,370],[961,774],[359,218],[751,67],[487,168],[741,366],[931,622],[870,497],[632,179],[689,592],[329,303],[888,50],[921,298],[800,725],[785,668],[353,337],[720,13],[970,671],[269,77],[803,170],[608,282],[461,294],[393,368],[700,433],[989,290],[442,397],[214,23],[631,309],[770,455],[976,332],[552,232],[915,88],[863,179],[453,158],[835,387],[840,572],[882,40],[471,284],[669,662],[817,173],[986,864],[569,336],[822,360],[205,57],[494,264],[357,77],[502,332],[885,104],[784,198],[591,145],[958,276],[898,378],[924,778],[644,450],[674,300],[405,284],[831,173],[989,29],[100,11],[187,0],[842,391],[477,226],[245,32],[754,434],[846,137],[747,194],[951,341],[897,465],[818,301],[890,295],[931,39],[919,786],[158,38],[620,137],[980,503],[803,138],[800,578],[667,202],[687,200],[441,42],[750,436],[781,385],[978,94],[849,565],[531,197],[971,735],[754,334],[782,719],[981,342],[382,318],[876,169],[711,460],[819,407],[875,837],[591,532],[475,31],[760,693],[575,493],[595,73],[762,18],[866,757],[919,103],[780,473],[220,216],[277,201],[574,511],[929,808],[617,194],[687,149],[872,530],[565,143],[997,873],[865,98],[664,48],[258,219],[166,73],[451,448],[939,459],[431,397],[813,679],[658,94],[638,587],[915,868],[636,380],[821,789],[123,67],[845,268],[195,55],[967,748],[581,184],[457,213],[936,419],[995,845],[920,600],[443,171],[988,933],[586,268],[641,277],[835,697],[910,798],[311,153],[289,276],[855,421],[936,24],[395,286],[978,690],[569,257],[583,357],[822,661],[929,147],[532,242],[872,822],[970,608],[631,22],[885,803],[625,176],[342,256],[980,657],[942,256],[523,139],[855,113],[984,247],[452,385],[939,162],[800,182],[731,132],[897,869],[270,79],[316,22],[652,334],[861,63],[769,291],[796,150],[242,29],[909,139],[633,23],[374,139],[945,899],[818,138],[738,182],[661,101],[857,815],[873,765],[843,200],[942,168],[946,816],[878,496],[758,321],[256,198],[802,196],[378,124],[960,232],[866,710],[580,555],[861,828],[785,345],[860,210],[907,681],[667,223],[195,173],[927,510],[660,318],[822,435],[783,536],[661,153],[639,181],[233,132],[313,42],[658,554],[962,251],[335,250],[707,572],[547,91],[592,13],[385,194],[296,291],[418,355],[947,561],[682,529],[653,644],[847,116],[480,65],[878,208],[362,135],[563,243],[924,718],[885,170],[707,627],[615,174],[542,243],[790,121],[999,973],[759,733],[487,476],[720,191],[185,148],[829,571],[608,302],[672,265],[996,283],[959,856],[527,460],[552,271],[763,522],[816,225],[541,115],[964,803],[683,501],[736,479],[663,70],[892,260],[757,6],[815,400],[712,108],[823,231],[385,219],[975,825],[806,240],[844,371],[943,77],[294,24],[922,539],[416,291],[904,629],[929,643],[740,731],[756,520],[968,866],[953,458],[689,580],[963,744],[819,525],[958,163],[730,626],[900,752],[537,235],[359,100],[831,176],[858,294],[357,271],[424,78],[993,50],[462,61],[669,394],[848,251],[537,479],[750,501],[915,215],[658,169],[736,375],[931,387],[993,509],[959,942],[969,538],[795,443],[274,47],[849,839],[681,257],[957,419],[942,560],[719,508],[262,1],[631,87],[185,160],[767,306],[876,317],[849,493],[756,252],[809,750],[418,298],[773,720],[925,692],[761,136],[506,466],[828,556],[595,251],[671,669],[603,351],[148,8],[701,547],[219,218],[725,377],[843,660],[816,484],[873,192],[880,159],[725,356],[759,553],[646,274],[704,68],[658,156],[678,263],[335,213],[955,158],[696,356],[673,558],[663,446],[614,344],[735,217],[809,669],[927,470],[987,318],[823,406],[499,205],[994,348],[833,584],[528,506],[785,563],[551,110],[670,636],[891,620],[868,46],[741,692],[781,676],[878,249],[319,12],[891,218],[425,291],[809,675],[37,19],[768,667],[780,497],[954,461],[759,385],[504,440],[594,237],[577,322],[852,144],[237,106],[633,69],[212,203],[469,43],[960,629],[480,9],[930,185],[468,122],[762,451],[975,973],[421,47],[514,294],[855,484],[902,357],[910,874],[157,127],[971,948],[500,139],[352,172],[608,195],[980,138],[445,206],[532,21],[585,216],[344,263],[845,221],[612,227],[699,436],[796,127],[813,462],[352,112],[231,110],[898,505],[402,154],[869,550],[987,858],[625,329],[796,237],[537,450],[594,113],[573,534],[886,797],[591,317],[242,157],[664,447],[995,95],[643,438],[875,780],[959,276],[976,694],[572,335],[853,256],[596,129],[819,333],[549,13],[533,290],[988,524],[842,534],[789,504],[899,485],[564,151],[541,261],[629,622],[568,51],[872,383],[968,698],[979,288],[489,155],[840,159],[975,637],[330,277],[996,111],[658,221],[726,454],[866,382],[853,595],[794,455],[862,241],[718,371],[825,667],[881,417],[404,387],[502,77],[794,9],[952,702],[430,304],[545,508],[744,360],[298,290],[951,221],[828,591],[850,474],[380,322],[470,353],[504,492],[666,533],[653,264],[563,153],[874,812],[397,74],[783,305],[820,699],[214,5],[518,338],[735,288],[695,399],[467,459],[947,630],[672,369],[950,449],[426,96],[794,111],[861,357],[945,509],[983,101],[496,317],[968,131],[466,437],[789,778],[670,468],[667,253],[586,581],[728,89],[996,210],[954,868],[940,282],[542,338],[479,11],[645,387],[948,533],[502,393],[945,261],[944,96],[519,263],[652,355],[804,311],[808,732],[989,657],[744,274],[180,40],[616,553],[516,344],[905,350],[845,277],[520,427],[692,357],[822,725],[666,329],[982,772],[988,874],[813,806],[968,883],[734,97],[644,333],[680,449],[395,121],[461,460],[976,542],[962,528],[749,348],[868,279],[791,335],[846,737],[951,876],[671,313],[398,277],[358,213],[357,209],[901,692],[790,247],[760,230],[811,277],[885,298],[832,650],[979,856],[847,656],[815,712],[981,350],[664,245],[666,123],[970,279],[911,874],[899,139],[752,197],[739,59],[647,509],[887,576],[359,340],[971,427],[466,157],[259,212],[897,831],[446,217],[985,592],[999,534],[524,65],[995,115],[533,238],[872,455],[737,230],[721,0],[617,443],[799,265],[405,323],[379,47],[603,339],[993,57],[516,160],[955,847],[738,4],[903,838],[822,658],[975,152],[205,1],[487,237],[587,149],[842,84],[996,177],[286,172],[868,862],[742,131],[398,97],[763,693],[692,174],[280,37],[710,428],[702,51],[474,251],[302,152],[858,609],[989,189],[520,274],[783,734],[779,640],[980,210],[449,120],[420,268],[163,119],[956,723],[959,354],[962,742],[708,544],[50,28],[873,797],[875,644],[749,231],[510,344],[150,59],[633,80],[825,245],[873,380],[711,130],[496,193],[425,215],[102,21],[290,283],[751,332],[771,426],[523,161],[79,2],[471,169],[686,312],[554,75],[728,340],[939,614],[693,40],[587,121],[292,2],[859,219],[709,130],[849,790],[707,213],[857,447],[689,165],[573,253],[721,293],[873,54],[916,696],[819,599],[664,60],[396,164],[747,245],[376,288],[149,43],[266,107],[586,482],[784,1],[628,182],[580,223],[259,65],[355,112],[385,302],[923,324],[927,800],[874,826],[989,756],[981,616],[640,516],[452,244],[887,500],[370,171],[950,12],[660,49],[783,702],[752,458],[212,57],[380,4],[49,43],[587,58],[803,506],[256,8],[857,345],[846,662],[564,400],[633,312],[548,186],[366,365],[404,133],[917,679],[437,345],[681,465],[434,313],[761,312],[714,189],[820,324],[722,346],[969,294],[668,469],[349,340],[498,237],[240,163],[802,590],[203,34],[907,640],[646,55],[863,334],[254,161],[564,335],[699,502],[922,158],[239,167],[634,144],[980,64],[546,496],[659,161],[620,372],[522,462],[955,698],[848,331],[931,140],[838,230],[228,215],[478,45],[930,852],[975,457],[418,179],[446,232],[667,342],[914,466],[907,375],[746,682],[350,219],[367,191],[267,38],[736,315],[491,299],[325,92],[784,6],[883,562],[397,225],[240,43],[833,144],[631,469],[112,104],[226,125],[589,251],[816,520],[680,482],[761,705],[601,259],[756,152],[523,92],[876,794],[602,495],[864,432],[335,229],[617,431],[943,591],[847,331],[559,83],[543,406],[797,472],[851,379],[731,536],[475,46],[883,574],[456,37],[478,465],[869,861],[103,8],[767,132],[314,163],[882,798],[327,239],[876,258],[388,143],[393,177],[730,409],[95,16],[882,385],[871,310],[525,170],[779,362],[188,101],[400,139],[633,411],[659,210],[819,712],[754,338],[895,42],[699,428],[875,472],[805,496],[918,754],[989,955],[742,225],[608,369],[910,509],[898,130],[896,149],[540,442],[857,226],[608,295],[747,386],[752,151],[242,182],[317,208],[945,67],[442,143],[838,367],[989,403],[899,881],[882,229],[783,387],[344,8],[156,94],[467,63],[299,168],[365,70],[578,12],[402,198],[846,286],[696,314],[500,393],[934,14],[856,241],[464,104],[687,685],[905,729],[964,485],[357,327],[513,166],[750,359],[645,400],[892,176],[890,749],[695,521],[652,607],[926,387],[128,70],[977,950],[599,545],[984,960],[887,527],[631,143],[826,147],[395,288],[448,213],[275,133],[781,703],[223,164],[501,151],[879,21],[623,600],[408,105],[521,89],[763,501],[658,473],[922,110],[923,633],[858,752],[981,674],[755,468],[696,227],[680,529],[902,563],[738,489],[402,75],[810,246],[263,62],[705,52],[990,637],[933,713],[471,409],[809,37],[742,614],[592,149],[144,39],[590,237],[966,385],[610,427],[225,172],[928,130],[962,744],[554,219],[940,588],[659,82],[388,60],[968,265],[220,181],[856,130],[794,348],[640,499],[839,689],[432,344],[105,58],[716,198],[881,136],[790,319],[517,342],[753,6],[254,162],[747,103],[710,392],[318,28],[254,91],[930,762],[942,451],[633,196],[779,200],[976,775],[432,17],[852,186],[527,296],[972,640],[856,552],[652,575],[398,270],[919,121],[584,475],[919,469],[684,599],[979,61],[962,214],[339,262],[667,619],[840,160],[733,412],[736,554],[987,470],[429,412],[652,186],[989,457],[768,79],[924,636],[941,348],[877,46],[727,126],[448,280],[852,751],[744,196],[493,81],[206,168],[924,669],[318,206],[682,167],[931,891],[898,23],[432,189],[970,362],[931,242],[980,282],[367,116],[943,627],[297,17],[243,10],[715,444],[812,529],[739,128],[839,440],[560,341],[544,39],[802,132],[415,397],[896,706],[272,61],[863,812],[897,140],[855,395],[932,843],[752,122],[421,305],[756,36],[849,510],[675,662],[735,131],[841,34],[108,8],[895,828],[975,364],[835,341],[385,165],[967,955],[839,435],[284,129],[490,215],[724,570],[795,656],[928,482],[956,952],[584,552],[265,209],[505,56],[995,686],[692,222],[814,481],[881,118],[811,129],[763,587],[811,278],[884,335],[997,685],[708,41],[760,488],[665,452],[920,801],[908,174],[967,139],[212,204],[549,35],[989,878],[313,307],[728,416],[712,55],[398,311],[939,167],[607,374],[801,438],[164,32],[561,521],[139,21],[759,406],[937,257],[357,46],[467,183],[884,124],[701,18],[866,514],[817,182],[874,714],[971,799],[977,141],[522,336],[855,423],[266,120],[391,117],[617,181],[979,723],[591,524],[816,611],[884,599],[946,630],[892,334],[855,289],[912,54],[835,695],[695,662],[717,138],[851,85],[171,20],[933,204],[860,580],[564,112],[881,747],[290,50],[611,485],[915,662],[784,333],[568,358],[638,276],[665,546],[782,277],[134,72],[356,278],[929,531],[902,9],[634,392],[985,556],[778,81],[809,566],[541,247],[723,412],[445,66],[621,14],[741,680],[856,448],[666,359],[444,287],[754,703],[928,764],[887,167],[534,35],[483,109],[821,426],[449,165],[738,639],[200,197],[864,361],[838,309],[593,63],[198,124],[389,326],[895,826],[885,694],[852,526],[602,483],[497,19],[633,112],[734,152],[392,120],[909,704],[681,477],[543,457],[309,180],[762,58],[791,326],[533,325],[658,192],[782,683],[791,227],[247,157],[968,728],[684,468],[792,133],[439,321],[629,97],[768,287],[463,193],[453,71],[781,37],[981,28],[758,58],[690,539],[562,145],[416,197],[745,362],[772,65],[911,634],[586,43],[809,128],[450,103],[545,26],[382,202],[704,635],[541,130],[752,77],[359,276],[834,390],[564,189],[923,24],[456,70],[823,447],[774,604],[492,383],[717,338],[858,767],[709,145],[964,645],[737,560],[606,330],[922,698],[403,189],[255,174],[902,681],[986,520],[784,256],[795,208],[595,84],[804,750],[950,323],[998,680],[482,451],[648,246],[516,48],[551,192],[970,688],[898,574],[409,362],[935,331],[222,43],[454,51],[925,641],[779,594],[705,209],[778,584],[355,135],[434,51],[680,357],[690,299],[336,174],[556,333],[417,325],[185,158],[203,202],[669,250],[945,415],[602,521],[530,224],[788,86],[654,541],[464,210],[943,367],[788,423],[295,279],[883,533],[607,401],[950,588],[665,253],[529,337],[950,937],[724,55],[918,789],[892,326],[987,409],[930,108],[731,574],[611,232],[733,53],[796,680],[595,376],[816,276],[327,70],[702,216],[392,162],[518,330],[912,341],[932,741],[428,252],[873,188],[389,120],[967,293],[511,48],[565,429],[656,613],[445,29],[981,893],[439,208],[588,417],[987,265],[769,283],[325,34],[859,811],[794,484],[962,529],[768,274],[401,233],[611,556],[431,209],[606,191],[873,539],[226,187],[567,338],[239,213],[615,331],[686,230],[865,7],[877,82],[892,289],[131,47],[573,247],[230,52],[592,150],[526,126],[915,80],[565,325],[560,245],[935,818],[974,237],[825,363],[513,215],[472,279],[863,657],[648,311],[966,574],[841,315],[699,84],[707,306],[980,237],[893,419],[914,302],[947,390],[941,304],[459,328],[651,545],[782,760],[617,536],[293,36],[826,790],[637,150],[826,295],[999,185],[673,506],[731,102],[994,19],[908,280],[406,96],[887,214],[940,14],[910,466],[524,344],[183,38],[219,117],[636,565],[775,493],[644,405],[782,765],[851,164],[840,89],[973,392],[981,255],[826,649],[438,360],[436,156],[172,15],[149,50],[931,818],[963,791],[765,166],[940,425],[568,139],[963,922],[819,393],[918,526],[720,407],[840,609],[179,85],[615,413],[921,483],[816,681],[900,799],[704,571],[288,9],[448,310],[591,373],[734,21],[718,505],[930,842],[910,193],[379,301],[731,249],[864,832],[769,587],[616,385],[906,759],[620,278],[897,405],[949,112],[839,409],[631,409],[982,319],[952,785],[355,276],[812,6],[650,24],[421,9],[536,316],[600,259],[370,101],[125,63],[191,108],[613,203],[793,394],[697,156],[624,26],[480,305],[877,499],[319,167],[683,204],[463,11],[884,469],[914,818],[763,757],[954,223],[347,325],[928,583],[799,158],[787,596],[991,864],[776,739],[961,36],[722,634],[597,204],[974,808],[627,151],[300,29],[442,393],[617,325],[359,253],[630,190],[642,491],[918,835],[848,685],[953,282],[231,149],[728,313],[994,653],[364,103],[644,533],[737,587],[813,401],[870,65],[736,156],[341,96],[153,68],[467,412],[947,735],[614,199],[513,321],[490,103],[390,34],[559,173],[936,570],[768,324],[513,505],[617,282],[807,722],[952,393],[541,57],[464,65],[797,366],[593,43],[441,386],[953,769],[142,36],[948,881],[666,72],[733,324],[887,857],[974,883],[363,60],[911,555],[959,157],[562,38],[803,324],[763,746],[987,724],[799,677],[948,900],[684,375],[373,263],[938,348],[827,166],[203,148],[822,660],[690,567],[800,211],[850,60],[773,410],[678,464],[661,495],[280,258],[378,343],[455,438],[815,146],[451,62],[167,52],[124,8],[643,565],[225,171],[892,407],[196,49],[896,162],[851,773],[701,267],[580,409],[625,96],[725,642],[248,104],[496,195],[882,542],[989,883],[447,388],[963,328],[939,454],[926,484],[403,102],[284,115],[943,246],[498,425],[413,108],[363,151],[907,594],[253,86],[761,294],[626,512],[983,243],[317,123],[911,121],[749,285],[878,598],[371,181],[891,569],[361,77],[997,499],[676,277],[928,177],[295,91],[859,120],[877,56],[866,325],[257,242],[842,40],[804,351],[884,709],[773,699],[684,75],[842,643],[552,31],[863,598],[975,875],[811,575],[616,372],[572,420],[950,719],[708,481],[870,4],[562,395],[832,98],[662,244],[264,81],[204,82],[814,789],[324,261],[563,412],[922,515],[309,110],[585,59],[874,532],[448,418],[807,85],[979,616],[292,243],[708,537],[718,364],[985,976],[640,434],[467,155],[752,196],[921,347],[891,39],[567,375],[628,185],[884,663],[957,811],[934,75],[494,457],[687,255],[869,60],[809,623],[512,2],[934,39],[116,6],[340,107],[769,744],[584,193],[851,39],[931,278],[119,18],[932,489],[650,310],[338,322],[445,152],[314,218],[875,366],[964,887],[879,468],[281,239],[901,355],[756,434],[699,537],[800,442],[642,348],[795,220],[986,956],[871,766],[636,61],[518,128],[961,39],[655,390],[884,340],[774,609],[933,383],[761,457],[521,310],[844,359],[945,835],[996,859],[130,102],[745,685],[553,460],[637,98],[976,110],[760,220],[310,33],[657,102],[897,328],[318,202],[583,336],[936,882],[608,397],[681,434],[687,139],[905,758],[200,95],[566,467],[523,175],[797,86],[436,162],[689,527],[614,197],[638,470],[753,742],[945,18],[744,399],[905,366],[561,502],[868,48],[845,30],[868,756],[449,11],[641,245],[516,434],[214,30],[395,59],[929,212],[482,16],[828,589],[866,734],[953,562],[971,933],[900,372],[859,544],[702,402],[588,400],[791,97],[330,66],[523,310],[842,437],[554,381],[284,15],[518,20],[825,1],[856,391],[797,84],[913,610],[551,477],[636,517],[327,165],[820,566],[547,466],[724,636],[674,55],[624,205],[878,780],[567,516],[464,367],[488,183],[586,275],[792,285],[417,343],[759,502],[544,382],[991,633],[871,528],[665,70],[624,398],[210,13],[930,628],[812,326],[160,133],[639,60],[463,363],[575,92],[373,160],[667,162],[456,159],[518,430],[847,102],[978,362],[578,403],[659,558],[269,61],[425,86],[151,11],[645,465],[545,202],[680,654],[485,336],[382,346],[592,244],[835,356],[634,423],[235,132],[838,199],[881,76],[496,358],[409,39],[847,616],[809,224],[928,309],[675,647],[368,300],[729,425],[514,140],[28,1],[893,874],[712,688],[324,117],[966,15],[944,730],[123,82],[319,56],[664,92],[888,5],[873,842],[883,393],[894,808],[530,301],[938,160],[888,616],[654,165],[635,371],[984,298],[957,485],[573,428],[823,536],[778,43],[834,163],[969,440],[580,256],[551,255],[377,327],[415,82],[998,570],[564,279],[940,668],[690,442],[932,280],[947,234],[396,96],[884,13],[754,472],[569,378],[456,396],[978,258],[620,235],[512,4],[912,30],[571,45],[386,192],[601,531],[643,301],[778,31],[874,493],[892,218],[986,850],[347,260],[987,288],[985,128],[883,735],[605,118],[288,241],[947,226],[947,358],[772,354],[992,486],[548,415],[949,719],[774,419],[708,497],[231,87],[668,570],[840,622],[364,271],[887,717],[979,120],[598,164],[433,137],[864,585],[911,85],[969,142],[774,250],[478,377],[125,52],[708,612],[976,607],[827,631],[337,7],[696,460],[455,342],[280,249],[773,231],[506,66],[423,415],[811,333],[270,17],[736,296],[574,72],[852,739],[764,561],[905,456],[900,22],[604,235],[888,622],[861,246],[321,271],[784,128],[249,26],[845,93],[661,3],[584,228],[849,240],[957,914],[733,75],[368,262],[719,422],[835,614],[690,482],[680,134],[703,317],[875,668],[361,339],[646,332],[901,377],[893,686],[718,482],[478,106],[736,443],[782,682],[773,188],[988,841],[786,161],[756,656],[810,181],[738,95],[918,372],[824,305],[403,337],[624,551],[426,363],[924,407],[880,406],[141,27],[975,300],[614,160],[452,446],[483,65],[445,398],[837,599],[533,46],[950,923],[686,290],[666,82],[592,342],[394,338],[486,76],[943,436],[930,719],[413,284],[491,332],[866,241],[905,616],[923,622],[779,239],[872,137],[213,136],[903,535],[375,188],[780,246],[831,811],[858,36],[902,62],[888,77],[803,113],[332,164],[947,288],[928,801],[924,903],[661,260],[487,225],[578,164],[565,51],[832,789],[712,371],[717,207],[687,462],[284,120],[540,329],[499,183],[818,568],[534,260],[267,83],[890,746],[873,871],[724,175],[809,632],[347,131],[826,599],[808,281],[636,467],[736,333],[790,653],[666,322],[186,64],[766,560],[911,296],[408,158],[639,495],[428,370],[540,89],[398,61],[436,185],[651,91],[388,63],[330,313],[655,377],[307,303],[760,632],[510,379],[893,659],[789,238],[710,467],[965,26],[82,59],[817,218],[365,164],[604,480],[778,112],[975,782],[654,52],[823,564],[712,332],[848,161],[976,179],[909,16],[931,151],[993,640],[901,609],[684,661],[436,99],[766,548],[464,353],[832,433],[913,600],[901,883],[804,722],[925,162],[892,52],[554,534],[405,212],[476,165],[747,495],[729,169],[163,134],[913,192],[656,628],[908,883],[542,317],[744,707],[377,343],[709,239],[886,140],[189,156],[923,829],[333,232],[932,858],[554,20],[645,212],[571,483],[634,105],[721,520],[986,676],[680,468],[862,427],[433,144],[743,338],[135,68],[897,108],[807,461],[665,535],[65,36],[267,262],[869,863],[412,176],[983,132],[992,616],[924,668],[470,469],[743,517],[774,146],[962,154],[904,640],[371,326],[749,270],[432,284],[561,408],[340,4],[195,120],[850,168],[897,778],[788,376],[628,97],[823,490],[909,887],[938,790],[328,218],[879,356],[989,751],[181,18],[326,177],[989,163],[459,8],[265,112],[869,305],[989,734],[221,131],[354,70],[880,131],[979,456],[815,345],[744,363],[92,45],[441,55],[975,542],[752,717],[925,828],[979,622],[880,745],[147,138],[551,109],[886,621],[926,643],[953,133],[945,586],[664,459],[469,152],[844,390],[479,302],[482,417],[85,63],[932,777],[950,458],[185,10],[715,509],[880,242],[520,494],[930,804],[550,33],[765,742],[425,410],[944,742],[84,39],[115,7],[508,466],[963,95],[435,82],[970,376],[822,558],[375,147],[824,32],[922,820],[608,376],[907,670],[820,673],[912,208],[335,145],[972,897],[727,431],[932,18],[854,707],[442,241],[922,752],[935,773],[960,930],[742,334],[472,174],[165,43],[364,80],[724,80],[903,393],[267,37],[947,464],[470,184],[529,404],[422,87],[972,444],[609,402],[563,392],[850,251],[917,509],[687,208],[334,50],[507,300],[808,368],[364,132],[776,300],[812,688],[985,280],[725,300],[712,517],[757,577],[998,811],[676,468],[895,454],[704,336],[53,36],[386,310],[382,149],[960,81],[346,301],[629,253],[827,532],[726,592],[741,403],[873,53],[639,95],[685,584],[977,92],[924,764],[845,199],[876,389],[813,661],[357,130],[836,605],[491,42],[966,380],[602,263],[792,147],[815,154],[190,94],[971,696],[710,189],[998,643],[991,582],[596,524],[932,411],[595,223],[774,455],[60,35],[413,99],[592,178],[159,9],[974,861],[753,366],[742,116],[931,519],[724,695],[858,304],[772,161],[676,374],[748,9],[791,485],[914,55],[733,277],[578,576],[913,793],[424,113],[669,85],[835,178],[813,788],[633,496],[294,282],[331,92],[908,155],[745,249],[532,424],[684,532],[347,200],[535,270],[593,332],[960,855],[340,296],[557,332],[917,469],[260,175],[851,359],[142,126],[902,475],[454,138],[615,238],[818,504],[888,88],[115,93],[867,697],[829,557],[252,250],[991,350],[707,408],[739,116],[891,357],[908,68],[657,227],[506,351],[404,136],[669,395],[975,424],[319,235],[490,349],[690,432],[586,4],[859,725],[924,569],[940,521],[413,335],[570,382],[805,337],[857,285],[928,556],[170,168],[158,14],[769,220],[525,305],[832,496],[880,806],[912,619],[873,267],[647,236],[343,333],[586,176],[488,280],[942,208],[950,892],[966,447],[969,767],[271,163],[548,364],[625,40],[711,312],[990,365],[776,77],[129,32],[994,707],[861,760],[927,547],[951,179],[851,481],[391,217],[279,174],[990,113],[949,663],[446,154],[694,495],[767,150],[345,146],[779,68],[666,302],[396,220],[894,621],[945,410],[913,448],[942,156],[260,188],[893,569],[985,311],[949,391],[657,314],[628,69],[818,357],[383,98],[850,574],[975,856],[736,276],[828,561],[34,32],[267,129],[846,681],[552,199],[985,939],[983,265],[60,23],[626,1],[887,431],[666,120],[802,732],[649,378],[809,481],[746,566],[716,130],[653,518],[733,481],[278,183],[868,705],[653,435],[970,358],[527,388],[981,166],[689,225],[577,487],[952,175],[109,18],[366,294],[277,176],[959,792],[662,387],[990,381],[464,387],[867,253],[840,33],[617,100],[734,504],[662,490],[508,179],[869,739],[924,42],[416,386],[752,442],[975,740],[539,509],[660,336],[546,290],[916,83],[772,599],[880,411],[787,760],[910,220],[470,31],[730,658],[694,191],[594,524],[397,243],[800,330],[862,159],[291,231],[338,297],[644,41],[986,470],[379,105],[691,493],[138,122],[341,103],[638,528],[824,457],[897,403],[685,79],[887,391],[895,575],[907,624],[726,720],[514,487],[370,56],[884,483],[145,10],[999,851],[925,863],[952,918],[417,94],[949,538],[999,255],[789,104],[856,534],[914,143],[803,474],[821,436],[957,619],[840,581],[707,223],[134,119],[743,455],[579,510],[369,241],[188,14],[869,237],[671,297],[824,739],[647,126],[813,777],[945,328],[149,127],[431,98],[961,628],[954,436],[949,470],[885,171],[896,892],[501,488],[639,423],[964,527],[677,448],[971,885],[993,235],[985,20],[606,140],[533,522],[547,166],[435,173],[857,439],[424,97],[529,195],[817,420],[831,300],[374,54],[682,96],[996,993],[746,734],[534,251],[838,244],[448,283],[758,487],[792,170],[799,20],[820,73],[526,229],[640,179],[849,519],[746,78],[990,326],[297,33],[861,468],[797,38],[768,115],[826,465],[597,62],[620,408],[669,428],[845,815],[527,445],[799,550],[772,72],[396,144],[622,33],[314,43],[986,304],[580,17],[418,239],[613,586],[735,704],[914,306],[984,203],[759,34],[617,483],[678,143],[425,321],[157,134],[943,188],[858,679],[930,175],[332,115],[278,142],[694,428],[205,62],[839,154],[766,332],[467,135],[795,328],[408,23],[458,425],[610,457],[858,282],[734,115],[940,62],[357,233],[248,50],[777,610],[265,250],[757,260],[460,369],[466,250],[224,63],[332,166],[958,234],[768,415],[991,101],[845,583],[810,263],[945,114],[597,221],[606,422],[911,763],[386,252],[754,656],[376,204],[986,890],[641,161],[275,124],[998,618],[885,793],[890,262],[918,711],[775,334],[741,457],[758,157],[655,462],[575,286],[609,110],[680,284],[788,226],[347,327],[603,375],[939,258],[506,422],[815,85],[458,144],[755,676],[194,64],[825,603],[845,425],[605,249],[362,158],[559,78],[464,342],[749,37],[947,479],[906,10],[709,402],[495,169],[650,118],[502,47],[729,64],[549,272],[797,506],[874,470],[651,2],[368,303],[615,204],[571,318],[892,367],[204,25],[528,438],[964,29],[967,625],[465,145],[991,1],[836,663],[939,412],[935,120],[651,53],[884,219],[779,142],[643,354],[911,746],[583,394],[315,8],[218,91],[665,331],[585,330],[362,299],[315,41],[226,90],[806,397],[732,374],[320,254],[432,26],[577,425],[994,737],[872,323],[291,60],[677,535],[829,169],[734,44],[768,516],[920,782],[647,249],[445,193],[915,140],[51,13],[711,600],[681,100],[511,75],[487,114],[741,703],[916,292],[907,35],[932,751],[979,278],[685,494],[487,150],[883,512],[382,122],[572,166],[699,669],[551,74],[960,228],[330,201],[910,251],[140,52],[882,820],[451,98],[726,410],[900,424],[910,803],[849,134],[640,353],[597,538],[788,290],[469,194],[628,517],[316,205],[744,76],[589,391],[695,120],[909,520],[720,194],[905,332],[716,77],[867,276],[508,97],[849,680],[947,103],[429,333],[329,299],[459,21],[775,664],[939,84],[350,138],[891,879],[218,8],[970,561],[846,22],[347,196],[850,418],[467,191],[815,153],[596,588],[632,517],[706,161],[616,270],[852,506],[727,122],[427,265],[924,869],[870,107],[958,311],[434,107],[683,353],[584,579],[952,564],[612,430],[830,753],[249,166],[931,231],[613,48],[386,2],[951,400],[393,69],[773,33],[510,111],[920,862],[677,239],[420,50],[780,548],[751,70],[995,555],[683,489],[636,631],[842,625],[843,653],[606,402],[954,679],[649,614],[539,292],[979,452],[416,73],[784,586],[468,190],[449,255],[651,322],[835,259],[878,819],[502,446],[772,580],[601,380],[954,687],[950,445],[531,89],[224,66],[953,873],[190,61],[600,417],[612,560],[107,89],[804,490],[113,44],[900,95],[990,124],[802,226],[957,297],[891,56],[362,291],[387,36],[698,138],[724,564],[708,614],[900,548],[383,91],[788,6],[524,477],[909,810],[197,84],[832,686],[361,256],[228,186],[444,153],[357,229],[161,68],[918,66],[634,399],[997,910],[452,81],[595,317],[583,288],[275,222],[917,219],[773,346],[274,133],[439,230],[383,337],[362,93],[547,511],[930,851],[57,31],[705,66],[352,286],[766,436],[919,463],[403,316],[718,709],[445,3],[560,123],[718,14],[446,335],[169,87],[876,175],[377,298],[979,243],[712,418],[438,43],[908,206],[566,48],[557,257],[593,65],[514,146],[855,90],[813,350],[832,702],[566,95],[661,65],[492,36],[791,675],[740,245],[125,96],[631,530],[921,351],[482,319],[839,279],[954,765],[744,518],[585,265],[838,363],[702,607],[702,681],[378,123],[731,705],[424,51],[650,512],[980,667],[721,417],[781,120],[714,74],[875,639],[861,728],[712,16],[949,142],[499,228],[384,31],[871,106],[907,500],[309,120],[559,436],[716,544],[916,616],[840,814],[874,688],[328,237],[680,513],[828,566],[714,205],[549,189],[942,346],[394,221],[742,5],[625,438],[838,647],[765,483],[234,101],[803,472],[247,139],[435,188],[739,555],[384,251],[808,116],[862,85],[817,100],[596,449],[490,474],[590,292],[848,212],[624,370],[932,287],[816,262],[302,173],[740,449],[887,658],[782,447],[965,766],[726,477],[645,195],[825,242],[993,533],[538,5],[981,793],[750,367],[556,527],[816,304],[416,263],[296,76],[942,614],[607,513],[329,136],[901,643],[993,785],[583,138],[536,260],[982,223],[301,178],[972,367],[385,345],[367,108],[615,321],[739,429],[652,234],[199,124],[739,433],[920,829],[766,229],[959,770],[485,108],[416,102],[944,479],[540,195],[733,141],[686,177],[249,117],[837,57],[910,246],[638,439],[832,785],[115,31],[517,139],[454,350],[955,777],[706,431],[655,512],[771,254],[734,607],[732,493],[299,244],[607,476],[247,206],[774,379],[847,390],[812,113],[474,24],[633,213],[971,800],[830,646],[341,134],[451,402],[766,238],[963,609],[735,277],[595,0],[674,576],[561,322],[917,319],[639,548],[803,196],[239,64],[843,669],[698,135],[257,25],[409,137],[957,13],[993,589],[669,309],[967,904],[354,325],[668,581],[669,583],[868,650],[974,37],[565,207],[887,261],[162,125],[984,450],[873,334],[717,219],[958,723],[994,405],[671,559],[803,432],[936,667],[992,207],[539,126],[691,63],[413,318],[453,111],[621,52],[867,754],[635,88],[668,483],[751,291],[426,52],[291,41],[718,109],[861,18],[370,209],[911,231],[761,382],[411,199],[544,153],[933,245],[462,331],[950,635],[697,444],[647,387],[994,528],[761,660],[499,125],[738,54],[229,199],[485,334],[581,556],[700,494],[992,946],[775,312],[885,822],[897,826],[882,667],[723,351],[600,579],[400,37],[403,42],[734,78],[656,556],[885,661],[654,429],[552,263],[723,408],[335,0],[499,54],[140,11],[989,636],[963,307],[574,567],[960,628],[875,347],[793,594],[608,395],[844,193],[821,281],[619,472],[770,580],[239,67],[181,162],[444,310],[332,202],[791,447],[812,634],[216,90],[911,767],[621,350],[995,797],[546,353],[905,849],[122,66],[912,347],[519,247],[738,164],[236,27],[641,160],[729,281],[706,222],[768,171],[491,0],[107,56],[367,139],[307,259],[473,352],[734,520],[933,883],[930,641],[809,229],[674,225],[937,141],[998,213],[230,119],[772,652],[658,51],[863,246],[886,638],[563,399],[564,271],[727,4],[716,147],[830,538],[661,619],[982,390],[659,357],[878,46],[743,396],[600,585],[722,97],[845,100],[752,509],[399,142],[383,119],[886,203],[627,508],[631,301],[629,273],[670,225],[232,99],[785,558],[461,444],[973,410],[991,670],[404,127],[777,112],[778,679],[910,887],[903,646],[969,355],[907,466],[696,311],[544,408],[453,400],[940,587],[877,387],[700,404],[887,608],[550,21],[785,569],[814,390],[428,62],[887,11],[509,160],[527,330],[494,158],[438,96],[875,115],[654,264],[630,529],[496,313],[822,401],[426,19],[206,60],[768,270],[620,146],[719,223],[716,671],[400,384],[654,529],[218,14],[700,469],[729,479],[766,569],[630,35],[975,827],[955,142],[363,138],[748,505],[908,436],[647,431],[809,55],[591,385],[767,734],[955,795],[619,99],[616,222],[284,234],[621,537],[674,400],[583,385],[860,34],[954,867],[211,184],[388,180],[885,843],[817,640],[729,335],[557,247],[995,694],[190,188],[670,311],[909,493],[236,52],[606,471],[572,472],[814,336],[543,76],[997,841],[481,52],[666,156],[865,465],[514,384],[411,135],[466,68],[801,770],[700,138],[352,139],[978,967],[899,336],[420,69],[762,64],[830,768],[981,282],[696,576],[917,832],[754,567],[647,333],[560,150],[348,66],[611,438],[863,189],[960,580],[628,127],[941,153],[212,1],[391,251],[698,338],[975,382],[854,771],[277,248],[540,181],[992,733],[985,407],[187,107],[555,143],[449,225],[784,153],[766,300],[544,429],[708,382],[788,70],[877,427],[309,159],[738,192],[787,149],[804,200],[792,213],[423,370],[702,156],[430,236],[606,567],[180,65],[503,146],[297,283],[781,534],[230,126],[424,279],[906,158],[519,256],[729,66],[881,669],[377,83],[487,235],[855,194],[225,148],[719,527],[809,297],[797,309],[161,84],[408,88],[944,492],[718,467],[693,678],[340,227],[992,504],[478,202],[342,326],[724,357],[762,370],[957,40],[861,712],[966,462],[849,216],[922,800],[814,141],[853,258],[730,378],[491,449],[657,3],[617,410],[569,322],[688,581],[353,162],[810,655],[809,659],[564,329],[891,71],[691,480],[762,587],[990,929],[473,194],[973,437],[635,603],[724,275],[405,305],[817,118],[595,305],[800,776],[285,156],[771,90],[781,517],[811,747],[823,162],[206,101],[729,457],[292,6],[669,275],[633,603],[701,540],[638,85],[738,555],[810,390],[830,520],[538,304],[388,385],[915,193],[370,166],[882,354],[494,347],[220,27],[845,671],[998,637],[376,372],[912,91],[741,694],[422,391],[394,251],[886,470],[646,470],[915,124],[986,805],[996,13],[794,308],[761,643],[650,546],[760,702],[361,178],[461,96],[716,593],[682,562],[651,596],[915,382],[582,185],[621,18],[939,216],[660,3],[283,124],[731,136],[864,523],[910,515],[791,491],[969,271],[586,521],[882,588],[927,827],[954,227],[897,142],[469,354],[856,299],[785,458],[863,803],[836,826],[964,235],[992,720],[924,5],[709,196],[800,731],[740,489],[436,303],[996,23],[722,615],[256,137],[830,614],[956,473],[46,9],[988,345],[621,159],[325,270],[879,535],[969,678],[943,893],[362,67],[811,541],[643,313],[231,9],[816,464],[996,2],[262,190],[473,183],[732,463],[782,201],[221,132],[736,322],[936,541],[690,23],[302,16],[405,225],[832,412],[427,235],[235,32],[551,454],[432,115],[510,466],[528,191],[357,37],[644,36],[647,147],[807,165],[965,958],[572,510],[671,596],[944,862],[826,235],[777,216],[890,569],[726,58],[949,224],[523,418],[680,578],[787,204],[656,111],[647,163],[770,60],[344,105],[818,597],[476,227],[959,78],[724,668],[784,398],[448,240],[268,56],[996,181],[947,34],[964,114],[948,606],[726,16],[535,514],[570,397],[576,312],[390,36],[942,514],[717,250],[731,386],[907,343],[671,418],[922,381],[730,106],[631,266],[643,25],[361,192],[774,206],[427,264],[486,386],[869,112],[974,207],[861,52],[947,769],[544,433],[917,885],[933,656],[958,707],[548,201],[867,487],[691,685],[614,224],[997,339],[555,477],[865,614],[993,376],[619,574],[196,20],[965,758],[761,163],[653,214],[990,447],[962,319],[325,315],[464,160],[887,684],[959,505],[682,596],[661,555],[43,23],[720,676],[658,261],[444,386],[389,61],[902,439],[514,232],[717,468],[628,204],[679,86],[467,366],[716,445],[629,59],[747,547],[889,63],[458,274],[978,195],[930,566],[456,218],[798,229],[109,61],[603,324],[588,350],[558,207],[584,189],[765,322],[567,277],[845,151],[373,2],[232,11],[930,218],[838,823],[453,248],[899,203],[930,810],[435,409],[390,296],[129,9],[866,197],[736,99],[820,738],[773,731],[866,414],[814,686],[406,312],[427,405],[827,22],[331,98],[554,60],[262,153],[918,909],[937,68],[259,1],[309,69],[537,282],[762,613],[904,71],[113,12],[962,79],[939,145],[232,220],[668,18],[246,117],[670,8],[937,842],[670,436],[503,379],[214,196],[278,81],[385,203],[995,474],[957,175],[854,491],[725,562],[884,574],[781,66],[855,10],[921,422],[960,360],[711,441],[634,484],[655,598],[995,601],[760,617],[975,183],[81,39],[800,788],[641,615],[667,395],[956,256],[789,393],[900,4],[144,49],[611,592],[754,315],[981,427],[904,828],[834,702],[955,715],[441,429],[817,267],[973,624],[874,393],[283,65],[94,6],[454,353],[295,102],[875,211],[650,136],[827,505],[655,70],[878,860],[883,518],[413,133],[206,17],[866,416],[839,744],[726,224],[958,410],[888,708],[790,160],[282,45],[934,836],[416,275],[995,635],[878,507],[472,365],[589,448],[559,189],[501,313],[941,502],[951,117],[329,290],[526,422],[728,704],[396,302],[763,19],[338,106],[485,18],[976,285],[866,697],[547,462],[745,285],[354,93],[199,111],[343,190],[559,302],[987,937],[489,370],[794,332],[532,406],[426,340],[690,418],[779,562],[956,77],[852,734],[687,88],[615,481],[516,359],[192,114],[445,232],[987,292],[375,248],[734,292],[369,286],[503,173],[898,424],[751,301],[666,234],[824,101],[962,674],[34,26],[792,513],[762,718],[739,276],[643,32],[135,40],[334,80],[711,86],[782,536],[858,728],[760,395],[470,287],[949,841],[422,331],[826,168],[791,137],[570,341],[899,339],[130,66],[883,699],[797,532],[816,22],[141,61],[942,219],[535,119],[559,220],[524,101],[854,808],[783,461],[236,187],[783,507],[681,392],[267,7],[773,160],[537,58],[128,62],[628,440],[621,611],[877,204],[625,488],[497,421],[829,637],[457,86],[315,280],[378,262],[539,377],[791,176],[868,421],[573,226],[429,124],[693,329],[472,399],[244,120],[410,135],[915,359],[181,36],[945,186],[974,561],[287,67],[829,811],[930,885],[789,761],[952,552],[818,239],[542,73],[498,77],[755,51],[688,396],[613,2],[831,66],[452,435],[916,582],[108,66],[923,620],[411,369],[928,172],[824,126],[742,569],[482,227],[969,712],[325,53],[860,399],[977,12],[337,303],[236,177],[730,478],[972,768],[677,387],[550,459],[309,39],[517,15],[817,98],[116,40],[291,132],[958,616],[690,7],[700,327],[944,818],[409,97],[937,404],[680,577],[687,179],[334,275],[843,430],[471,301],[311,94],[557,62],[833,167],[854,136],[557,233],[796,651],[840,221],[962,321],[545,466],[963,123],[936,301],[376,134],[612,391],[880,651],[313,89],[479,293],[809,75],[288,114],[709,535],[718,629],[907,328],[782,487],[576,11],[504,445],[820,608],[951,886],[795,346],[728,221],[870,814],[504,230],[907,109],[538,200],[749,649],[828,472],[774,6],[583,513],[628,353],[891,689],[725,367],[450,436],[474,409],[915,490],[137,76],[938,625],[444,308],[980,511],[737,674],[532,185],[999,890],[855,781],[577,488],[334,208],[774,445],[510,421],[469,344],[425,119],[431,318],[829,103],[810,266],[980,892],[786,282],[619,391],[642,104],[748,130],[120,72],[768,0],[747,613],[801,718],[856,845],[905,351],[801,363],[915,253],[303,4],[872,468],[882,481],[535,247],[373,335],[458,74],[856,427],[608,436],[606,209],[953,113],[905,204],[276,80],[850,579],[960,215],[365,89],[508,246],[758,99],[960,381],[624,36],[950,556],[921,70],[85,66],[112,55],[438,240],[823,0],[262,98],[617,538],[405,194],[538,197],[971,676],[693,27],[823,633],[514,241],[850,391],[968,336],[932,227],[113,45],[817,301],[468,151],[932,292],[942,374],[697,194],[772,188],[688,119],[715,378],[713,185],[844,322],[332,221],[965,144],[699,167],[830,39],[806,310],[673,542],[964,561],[638,190],[994,547],[305,95],[874,395],[327,147],[795,323],[638,301],[964,556],[511,39],[611,328],[628,404],[656,634],[750,727],[762,262],[744,219],[546,433],[579,254],[504,410],[396,7],[876,74],[601,540],[842,54],[810,619],[596,93],[643,33],[847,54],[609,243],[205,145],[825,660],[557,278],[727,229],[439,104],[826,824],[985,655],[982,407],[462,238],[997,149],[880,802],[658,619],[270,197],[479,73],[889,774],[983,654],[846,291],[994,368],[663,102],[467,79],[739,315],[384,354],[197,3],[833,270],[901,582],[953,652],[541,351],[339,101],[529,371],[957,675],[953,899],[703,270],[868,329],[778,78],[664,523],[745,275],[313,48],[633,617],[536,123],[268,122],[434,57],[942,486],[960,44],[972,912],[321,269],[872,407],[797,281],[516,411],[847,276],[605,362],[605,574],[261,204],[603,369],[999,120],[536,242],[512,125],[733,676],[592,155],[952,272],[735,448],[138,11],[114,93],[544,296],[616,193],[852,492],[450,313],[982,78],[755,44],[951,604],[907,626],[577,13],[365,251],[903,424],[972,512],[760,137],[484,327],[773,63],[219,166],[469,358],[494,461],[792,728],[950,120],[784,568],[750,580],[795,782],[620,598],[908,296],[555,519],[813,451],[726,155],[485,90],[881,98],[338,154],[751,487],[741,736],[541,410],[676,118],[180,90],[871,194],[955,60],[573,515],[661,182],[562,254],[545,344],[736,5],[499,25],[871,287],[811,141],[434,251],[407,116],[895,884],[600,1],[600,246],[484,25],[835,706],[477,231],[411,221],[488,173],[693,14],[607,384],[306,172],[612,118],[989,539],[621,506],[541,308],[982,218],[829,164],[978,508],[374,109],[447,282],[969,264],[373,143],[408,160],[892,438],[517,124],[180,68],[638,632],[153,94],[964,356],[306,36],[337,58],[216,191],[939,85],[896,51],[844,182],[666,526],[701,128],[985,167],[427,349],[989,572],[977,164],[930,249],[351,46],[722,300],[915,862],[210,53],[843,612],[895,769],[608,349],[392,65],[633,220],[909,893],[919,793],[464,323],[567,315],[167,124],[704,189],[288,150],[942,522],[589,500],[178,144],[722,274],[927,737],[816,345],[491,209],[765,36],[625,180],[515,215],[564,355],[412,296],[604,340],[198,59],[574,345],[937,209],[767,763],[867,757],[853,57],[450,201],[369,160],[306,261],[966,542],[381,76],[841,406],[336,116],[806,577],[226,159],[262,47],[362,238],[824,490],[595,66],[764,506],[785,600],[936,219],[954,365],[706,542],[910,226],[355,32],[440,371],[963,955],[473,66],[641,377],[496,260],[222,87],[893,840],[522,476],[739,378],[897,74],[367,132],[916,871],[986,434],[384,209],[303,296],[521,360],[252,167],[562,105],[995,937],[649,28],[519,364],[689,130],[190,69],[739,393],[826,24],[430,246],[379,317],[697,445],[494,129],[839,627],[847,258],[163,76],[955,182],[919,399],[721,360],[690,376],[770,660],[473,97],[834,359],[923,868],[354,261],[734,491],[220,178],[635,218],[924,4],[409,236],[920,827],[946,238],[569,276],[873,227],[853,219],[808,291],[717,492],[709,574],[856,163],[863,308],[886,734],[335,222],[871,124],[482,192],[431,4],[919,407],[987,274],[716,598],[694,1],[870,630],[977,771],[830,591],[662,148],[828,202],[677,600],[969,522],[246,16],[532,98],[395,279],[596,554],[574,67],[322,258],[620,289],[748,512],[847,265],[279,179],[541,154],[488,106],[296,274],[367,168],[930,801],[419,78],[879,370],[978,960],[319,133],[902,360],[603,534],[884,768],[437,107],[643,284],[924,909],[114,42],[810,570],[593,334],[567,410],[916,178],[962,50],[861,216],[534,521],[945,911],[846,353],[938,183],[891,810],[940,328],[233,50],[906,48],[497,117],[503,387],[420,392],[610,489],[398,365],[721,242],[136,110],[813,418],[606,69],[138,12],[615,319],[417,86],[986,13],[958,518],[907,214],[920,380],[147,58],[665,574],[623,35],[521,279],[686,162],[498,88],[451,206],[247,120],[553,2],[407,255],[154,96],[952,182],[855,221],[749,462],[509,174],[829,496],[808,500],[141,32],[72,29],[924,60],[261,133],[406,372],[462,256],[964,670],[842,822],[854,354],[901,361],[999,621],[797,139],[860,737],[351,17],[897,323],[287,11],[681,571],[953,10],[550,375],[765,342],[196,88],[996,45],[958,193],[742,371],[996,326],[609,588],[661,417],[441,274],[836,309],[512,421],[225,158],[918,22],[238,80],[802,490],[374,259],[508,100],[762,182],[209,108],[750,299],[866,558],[398,206],[668,342],[610,452],[396,87],[706,367],[290,227],[631,40],[873,728],[985,164],[889,70],[910,790],[987,965],[901,728],[877,720],[331,38],[799,405],[777,132],[987,934],[983,157],[842,135],[706,181],[688,479],[822,372],[241,170],[410,20],[728,496],[545,539],[462,413],[934,172],[802,596],[808,400],[336,172],[824,192],[826,250],[333,252],[991,175],[396,378],[571,436],[541,304],[477,43],[927,251],[394,377],[597,425],[660,518],[836,563],[872,185],[280,81],[805,236],[985,954],[298,55],[512,263],[647,267],[863,444],[795,395],[855,74],[654,315],[856,161],[676,415],[618,163],[942,762],[998,278],[913,765],[796,216],[863,322],[804,433],[893,243],[654,212],[524,440],[748,77],[911,519],[695,176],[387,293],[359,194],[686,272],[822,196],[920,49],[739,10],[820,476],[516,237],[463,10],[702,388],[880,405],[893,724],[783,629],[493,470],[637,579],[614,19],[720,649],[716,94],[784,499],[597,77],[625,581],[442,441],[961,898],[785,186],[652,261],[997,656],[942,828],[459,122],[879,677],[466,460],[950,378],[790,146],[932,833],[631,375],[977,635],[852,135],[635,339],[715,137],[758,90],[696,679],[935,168],[129,37],[781,30],[127,23],[835,479],[934,346],[603,189],[594,454],[219,186],[922,487],[737,10],[591,262],[830,183],[702,680],[722,172],[522,30],[924,531],[715,408],[958,601],[739,316],[839,397],[341,204],[399,63],[958,582],[425,27],[468,117],[346,170],[721,64],[839,816],[872,598],[321,194],[453,250],[623,575],[680,322],[552,257],[644,215],[707,59],[229,114],[450,320],[366,73],[597,330],[955,487],[723,135],[723,450],[506,450],[722,23],[830,627],[773,590],[151,83],[863,630],[738,497],[867,363],[922,913],[945,888],[789,499],[219,46],[995,266],[639,272],[508,141],[857,639],[833,361],[878,551],[367,330],[930,197],[797,259],[905,82],[546,101],[398,332],[778,328],[642,431],[136,21],[867,685],[565,313],[257,140],[862,549],[992,324],[567,355],[948,55],[779,120],[969,478],[911,676],[331,115],[516,149],[260,120],[795,432],[503,81],[892,459],[714,585],[557,334],[680,308],[645,151],[980,177],[938,145],[499,139],[493,181],[832,726],[686,281],[991,808],[688,493],[926,737],[763,491],[469,430],[652,90],[634,116],[699,75],[548,46],[69,14],[793,237],[758,3],[811,400],[949,689],[405,144],[678,226],[900,322],[267,231],[750,326],[820,455],[488,145],[55,34],[671,118],[761,303],[446,132],[824,108],[916,771],[310,14],[882,828],[596,201],[386,341],[950,537],[192,58],[710,472],[691,333],[992,795],[394,55],[771,332],[469,23],[593,345],[70,33],[660,498],[639,515],[988,696],[381,331],[234,192],[503,305],[653,72],[375,129],[928,678],[565,492],[991,207],[890,4],[678,605],[196,110],[728,130],[904,840],[926,783],[777,606],[485,171],[968,818],[216,33],[465,185],[414,62],[487,70],[555,343],[668,540],[257,33],[685,176],[66,33],[465,338],[892,135],[589,564],[849,648],[754,487],[253,240],[719,283],[800,428],[644,636],[843,799],[314,61],[956,735],[782,359],[979,210],[377,272],[735,48],[888,767],[844,606],[259,151],[829,567],[906,628],[863,647],[796,595],[547,54],[818,304],[507,132],[903,717],[553,272],[794,177],[288,224],[732,689],[68,32],[124,83],[977,283],[220,149],[950,60],[749,189],[956,757],[828,135],[956,184],[255,68],[549,419],[223,80],[463,173],[253,107],[834,307],[405,147],[910,377],[503,214],[708,409],[828,819],[480,2],[885,813],[938,168],[469,265],[964,591],[520,479],[333,322],[424,179],[727,238],[957,738],[337,177],[953,56],[766,83],[297,188],[556,486],[740,253],[377,41],[758,702],[651,371],[537,304],[423,185],[907,352],[494,463],[735,590],[467,80],[673,57],[952,474],[367,215],[856,641],[896,366],[881,806],[199,42],[704,105],[534,402],[937,461],[742,377],[871,307],[355,3],[477,420],[616,594],[954,555],[765,689],[964,938],[595,274],[508,472],[676,259],[513,192],[726,378],[887,434],[997,35],[818,467],[471,393],[632,89],[357,279],[922,632],[942,36],[459,151],[239,13],[736,469],[299,9],[742,249],[923,653],[772,504],[447,188],[885,572],[991,757],[706,658],[944,765],[698,25],[518,127],[833,125],[891,704],[997,905],[821,262],[465,151],[854,720],[889,39],[897,600],[436,163],[64,3],[270,50],[319,316],[935,527],[547,285],[714,221],[921,852],[983,538],[471,145],[345,329],[950,250],[790,34],[815,714],[805,210],[765,44],[765,738],[734,615],[994,889],[952,253],[671,663],[405,74],[325,247],[259,199],[342,43],[650,474],[883,747],[813,65],[229,207],[720,219],[791,784],[829,341],[853,605],[913,87],[770,726],[728,128],[859,132],[885,107],[148,11],[791,722],[569,321],[825,121],[348,111],[858,722],[394,107],[824,24],[371,246],[581,73],[891,68],[385,111],[867,635],[254,185],[997,83],[561,435],[88,64],[51,33],[603,294],[291,273],[706,191],[772,639],[570,136],[713,689],[805,491],[967,182],[846,599],[509,305],[885,631],[955,765],[362,209],[359,326],[676,533],[319,257],[510,131],[163,36],[807,350],[703,476],[734,658],[971,461],[951,947],[722,688],[841,784],[966,99],[814,715],[903,447],[934,215],[933,759],[157,110],[807,509],[906,443],[610,543],[220,175],[500,183],[215,188],[815,442],[713,325],[688,130],[808,325],[556,401],[722,409],[235,174],[602,341],[435,146],[989,221],[937,95],[980,403],[916,3],[652,370],[399,134],[396,202],[713,125],[470,385],[172,121],[695,330],[932,261],[430,345],[725,362],[393,85],[795,694],[843,730],[812,109],[935,111],[988,251],[486,92],[770,721],[321,310],[573,204],[753,10],[870,323],[516,395],[655,112],[879,158],[707,629],[272,256],[682,91],[834,529],[920,170],[332,184],[799,75],[486,325],[267,79],[839,428],[868,80],[585,511],[959,400],[734,650],[485,430],[765,1],[936,489],[936,399],[394,247],[985,661],[882,365],[715,639],[524,49],[988,275],[271,258],[755,114],[882,10],[369,113],[935,695],[810,231],[286,39],[225,47],[644,320],[528,309],[793,700],[692,14],[964,300],[281,43],[173,171],[939,660],[471,372],[425,276],[720,231],[247,111],[827,400],[521,227],[534,244],[261,120],[664,444],[975,524],[988,873],[869,175],[569,186],[638,250],[623,66],[499,452],[180,59],[99,8],[475,287],[437,233],[439,397],[779,554],[915,221],[395,321],[985,436],[859,37],[761,349],[779,295],[942,471],[502,119],[593,104],[743,447],[467,51],[452,448],[575,462],[972,23],[599,371],[181,102],[907,404],[810,272],[537,23],[839,636],[827,785],[850,591],[435,191],[463,302],[882,89],[787,256],[549,132],[859,495],[883,529],[768,18],[983,178],[906,259],[321,227],[912,462],[896,215],[508,18],[825,384],[603,0],[862,69],[570,380],[832,71],[759,601],[758,754],[789,434],[159,19],[622,257],[914,653],[810,416],[794,231],[167,96],[68,20],[705,616],[264,235],[848,231],[833,13],[405,290],[725,694],[190,9],[878,139],[673,201],[798,62],[598,145],[377,312],[814,375],[799,611],[702,58],[659,128],[952,521],[921,214],[953,944],[541,271],[468,370],[813,301],[801,447],[598,291],[769,265],[353,79],[630,215],[440,317],[929,257],[703,107],[834,87],[882,383],[336,128],[62,13],[783,296],[443,279],[926,690],[864,450],[277,20],[749,171],[277,237],[196,11],[196,44],[793,201],[635,500],[505,218],[841,69],[360,106],[514,54],[887,382],[893,109],[125,44],[805,593],[451,293],[904,664],[668,360],[878,446],[689,345],[964,638],[796,43],[728,632],[628,50],[774,338],[643,255],[907,606],[949,210],[360,95],[245,9],[869,348],[244,172],[766,158],[964,113],[797,565],[893,200],[899,443],[439,102],[678,460],[444,352],[736,690],[980,250],[938,863],[878,318],[636,525],[837,470],[501,416],[727,636],[534,267],[534,341],[454,293],[384,73],[893,471],[638,359],[436,213],[609,104],[322,249],[181,51],[591,53],[498,310],[766,455],[801,155],[566,527],[386,342],[809,642],[879,116],[934,399],[801,643],[788,421],[747,524],[946,611],[960,950],[571,375],[478,453],[824,304],[612,6],[886,217],[833,598],[864,68],[745,675],[742,269],[439,285],[792,209],[796,583],[809,801],[991,519],[679,194],[851,267],[927,288],[468,224],[850,116],[498,20],[846,221],[681,75],[328,97],[873,708],[205,61],[709,366],[955,658],[754,699],[895,345],[915,404],[761,299],[358,3],[161,14],[595,303],[961,184],[127,84],[596,346],[683,540],[921,324],[505,167],[819,510],[740,721],[828,207],[978,205],[783,573],[457,136],[913,384],[621,511],[446,432],[758,429],[552,155],[678,505],[936,605],[748,605],[279,171],[795,19],[863,550],[493,210],[742,152],[696,170],[786,545],[343,36],[468,183],[746,359],[295,232],[384,204],[943,59],[698,419],[969,871],[936,829],[790,123],[751,113],[488,133],[603,564],[617,231],[485,473],[810,242],[340,152],[998,741],[986,951],[549,467],[876,618],[608,495],[628,603],[561,338],[996,185],[99,15],[765,530],[514,349],[657,451],[897,59],[716,54],[944,135],[352,335],[760,753],[534,333],[994,831],[586,542],[612,42],[949,867],[623,315],[982,441],[645,138],[675,486],[870,700],[812,505],[784,487],[848,757],[733,139],[682,416],[548,544],[591,254],[586,208],[991,134],[827,471],[664,298],[919,393],[686,132],[969,47],[791,483],[980,944],[263,196],[902,248],[917,659],[560,128],[588,5],[498,198],[452,299],[619,229],[847,165],[684,294],[960,457],[915,401],[686,677],[576,150],[791,179],[382,5],[445,220],[827,607],[772,560],[683,97],[724,571],[717,214],[672,33],[975,318],[578,215],[907,27],[769,679],[730,295],[662,274],[845,388],[986,615],[114,82],[764,140],[762,108],[556,214],[93,92],[399,280],[622,612],[726,328],[973,232],[725,403],[671,307],[831,307],[150,49],[935,572],[735,46],[658,119],[753,35],[522,227],[446,176],[266,77],[441,239],[808,270],[753,254],[741,16],[206,138],[391,273],[664,637],[970,543],[944,838],[356,176],[804,530],[977,750],[599,61],[530,129],[477,41],[464,12],[133,121],[981,840],[816,277],[804,57],[653,465],[817,738],[727,204],[312,96],[771,431],[905,853],[801,584],[869,99],[678,271],[655,466],[805,565],[750,364],[969,132],[750,123],[943,63],[441,33],[423,373],[992,980],[837,560],[687,345],[611,214],[606,433],[651,319],[954,357],[250,34],[610,157],[609,184],[509,89],[547,272],[578,101],[545,65],[978,89],[698,215],[674,292],[727,305],[990,598],[723,295],[840,169],[980,916],[235,183],[484,389],[782,130],[745,236],[357,335],[663,367],[405,106],[541,402],[807,449],[244,53],[904,334],[497,351],[601,245],[408,316],[480,233],[799,202],[180,172],[735,612],[621,190],[598,419],[887,87],[897,746],[822,564],[918,529],[760,245],[877,124],[503,409],[761,65],[509,86],[915,902],[397,150],[286,22],[502,40],[312,164],[607,583],[914,721],[665,579],[409,18],[414,121],[551,302],[546,429],[268,79],[969,123],[687,339],[855,114],[798,622],[741,253],[832,65],[743,598],[728,536],[166,42],[596,518],[863,346],[663,624],[819,733],[752,272],[941,611],[816,661],[839,306],[288,252],[669,520],[415,145],[544,485],[395,154],[550,358],[779,268],[884,147],[776,718],[959,479],[842,325],[928,270],[899,708],[78,13],[998,931],[646,162],[928,186],[762,68],[490,11],[852,844],[504,271],[783,691],[242,71],[817,650],[964,668],[397,230],[582,58],[761,205],[892,251],[909,367],[762,644],[394,155],[790,139],[596,173],[981,120],[892,625],[867,763],[650,43],[987,72],[804,788],[947,643],[733,536],[868,411],[856,250],[419,270],[585,297],[764,632],[347,14],[991,399],[842,486],[965,810],[277,8],[610,597],[827,541],[349,62],[251,226],[687,24],[900,813],[836,5],[252,14],[527,85],[525,425],[930,82],[883,339],[795,546],[804,358],[349,33],[996,679],[864,719],[806,291],[939,223],[854,126],[551,147],[851,299],[867,738],[925,587],[628,183],[809,28],[211,142],[150,47],[980,209],[662,617],[378,312],[837,309],[973,275],[767,326],[878,80],[731,170],[673,213],[636,252],[332,134],[344,221],[717,262],[491,136],[395,5],[760,171],[464,427],[851,345],[463,50],[870,324],[865,379],[894,888],[517,396],[809,487],[655,46],[898,260],[919,803],[742,670],[394,105],[515,383],[596,537],[776,327],[120,93],[865,386],[926,605],[997,556],[933,369],[368,22],[180,96],[829,818],[414,148],[291,64],[879,197],[612,423],[539,478],[841,639],[913,581],[748,37],[913,287],[847,482],[552,149],[872,849],[565,451],[485,19],[455,225],[665,524],[987,386],[437,419],[669,430],[991,599],[705,441],[913,817],[758,248],[671,568],[224,215],[455,395],[671,172],[638,600],[986,626],[769,44],[272,71],[812,374],[500,267],[859,76],[935,274],[449,200],[302,299],[627,201],[293,181],[834,589],[706,670],[288,276],[812,403],[981,273],[913,617],[997,435],[792,313],[673,536],[703,53],[930,97],[312,122],[936,157],[708,125],[448,433],[748,153],[680,64],[462,225],[910,826],[657,621],[905,497],[825,153],[682,270],[915,205],[421,184],[424,233],[931,547],[562,56],[200,147],[600,3],[429,221],[262,50],[739,404],[242,207],[861,570],[809,732],[700,558],[158,21],[980,710],[894,180],[837,774],[814,25],[908,718],[352,42],[779,55],[921,5],[976,722],[523,227],[451,219],[593,578],[826,655],[399,312],[983,583],[918,894],[849,144],[866,117],[421,337],[925,12],[685,62],[807,171],[811,335],[973,775],[740,325],[943,933],[864,509],[334,57],[193,47],[888,300],[540,346],[479,184],[987,778],[879,45],[823,319],[648,529],[740,287],[815,378],[773,409],[616,495],[943,32],[297,278],[795,387],[339,215],[857,292],[233,230],[920,119],[921,89],[721,54],[989,0],[884,524],[728,668],[510,246],[925,418],[655,613],[846,602],[978,753],[999,345],[596,199],[857,647],[828,43],[888,658],[798,17],[960,541],[748,53],[330,98],[693,513],[894,132],[717,263],[480,364],[442,220],[435,248],[912,536],[572,184],[831,242],[772,302],[827,765],[358,239],[302,37],[427,263],[514,489],[831,132],[811,643],[907,94],[967,175],[891,370],[366,274],[128,14],[924,700],[548,501],[902,855],[749,288],[894,341],[624,601],[722,258],[402,129],[813,231],[767,2],[708,360],[522,160],[658,109],[696,408],[958,91],[736,525],[855,583],[840,155],[239,16],[746,562],[263,135],[741,500],[826,429],[541,183],[574,87],[695,467],[908,10],[724,67],[950,894],[494,178],[812,557],[686,378],[981,482],[715,358],[794,161],[431,78],[320,268],[110,77],[713,147],[796,632],[839,463],[761,478],[755,419],[720,312],[489,333],[348,55],[571,75],[351,147],[518,473],[772,249],[998,529],[811,412],[991,794],[792,141],[712,638],[919,821],[502,344],[799,14],[532,76],[653,612],[257,158],[954,622],[359,97],[271,15],[742,571],[918,471],[996,633],[562,296],[831,765],[752,3],[718,9],[417,406],[536,50],[551,539],[795,73],[804,347],[509,189],[939,876],[953,715],[616,70],[876,763],[798,720],[343,261],[340,17],[850,186],[537,326],[899,244],[388,127],[353,78],[430,256],[678,543],[779,1],[500,121],[257,78],[365,219],[314,162],[990,423],[788,285],[417,64],[924,739],[881,325],[342,77],[483,150],[669,551],[669,576],[980,366],[297,280],[716,104],[945,274],[781,344],[914,19],[779,723],[820,630],[303,16],[894,531],[826,730],[948,684],[918,490],[840,239],[922,690],[695,269],[359,165],[863,296],[448,331],[529,14],[619,126],[522,177],[575,139],[721,179],[202,190],[871,499],[277,101],[689,678],[486,186],[958,206],[861,371],[144,48],[723,7],[777,298],[751,217],[852,161],[176,114],[607,294],[966,569],[665,4],[630,428],[493,131],[679,41],[334,297],[676,56],[586,41],[779,759],[754,129],[803,696],[879,651],[839,31],[973,285],[378,363],[384,40],[824,805],[686,127],[227,201],[986,153],[865,678],[638,140],[737,718],[919,636],[887,874],[873,727],[681,373],[904,705],[944,550],[648,45],[809,718],[989,443],[608,85],[727,681],[633,1],[575,388],[760,466],[909,133],[816,240],[940,493],[251,69],[165,141],[567,32],[473,459],[423,11],[654,174],[742,139],[216,209],[577,407],[950,341],[627,255],[860,353],[958,386],[607,525],[660,199],[688,424],[189,31],[743,181],[644,555],[693,179],[256,135],[687,531],[916,354],[92,8],[868,717],[919,569],[760,532],[973,3],[924,226],[875,784],[881,126],[732,82],[674,375],[891,673],[429,413],[592,589],[976,296],[867,599],[744,703],[925,422],[617,446],[663,454],[251,74],[789,202],[607,418],[778,655],[267,45],[947,895],[554,466],[949,814],[770,769],[730,132],[909,838],[834,70],[549,344],[988,86],[690,164],[170,106],[228,178],[722,592],[979,740],[691,464],[651,26],[75,12],[418,143],[452,206],[887,155],[561,491],[757,355],[442,221],[964,347],[478,315],[459,221],[673,141],[836,513],[511,105],[707,698],[849,195],[620,346],[992,480],[232,153],[974,815],[853,131],[866,186],[386,233],[484,139],[907,203],[789,347],[634,318],[832,381],[821,293],[281,106],[935,443],[184,65],[712,2],[500,391],[995,102],[821,238],[937,647],[357,53],[276,121],[777,5],[971,526],[923,751],[390,23],[933,310],[546,15],[413,27],[594,212],[243,91],[457,414],[675,421],[399,119],[404,394],[271,243],[600,414],[311,234],[977,900],[329,24],[673,641],[719,184],[481,203],[985,215],[424,267],[917,838],[556,67],[887,523],[986,186],[849,181],[739,545],[224,15],[995,633],[937,27],[210,173],[210,196],[441,342],[484,251],[261,224],[694,300],[630,297],[942,746],[968,587],[950,393],[703,153],[814,713],[563,277],[365,146],[611,408],[994,340],[690,74],[556,465],[935,908],[330,264],[421,282],[161,9],[253,89],[793,142],[919,181],[554,250],[822,515],[233,162],[995,299],[979,726],[698,90],[865,538],[991,261],[516,89],[640,230],[792,404],[781,96],[772,690],[752,128],[436,202],[693,61],[113,46],[857,141],[640,506],[717,101],[810,228],[952,635],[805,336],[856,316],[955,783],[279,70],[571,424],[591,19],[626,311],[886,588],[581,539],[773,692],[988,1],[777,304],[785,222],[811,789],[738,276],[984,485],[909,791],[923,299],[553,48],[983,207],[620,242],[929,229],[353,231],[997,408],[605,83],[708,632],[303,203],[936,743],[870,647],[957,375],[673,164],[503,195],[723,137],[966,783],[506,342],[808,721],[574,486],[874,293],[732,425],[686,146],[156,35],[625,402],[985,59],[748,327],[731,588],[642,9],[819,673],[813,723],[417,109],[660,329],[155,13],[693,31],[815,803],[382,78],[797,420],[874,355],[789,38],[667,599],[648,194],[999,747],[273,213],[716,622],[605,377],[342,182],[460,223],[947,287],[647,1],[993,674],[582,481],[765,338],[736,689],[981,34],[608,570],[929,18],[463,226],[262,205],[965,254],[631,361],[732,113],[751,617],[688,94],[810,352],[235,68],[319,55],[634,72],[883,420],[988,986],[640,143],[795,585],[280,118],[473,386],[793,326],[162,128],[681,110],[538,196],[365,97],[226,30],[920,761],[362,355],[964,296],[194,26],[354,115],[934,269],[777,36],[938,21],[963,377],[887,365],[778,137],[811,655],[948,580],[790,455],[675,396],[702,148],[581,286],[809,17],[639,445],[721,612],[901,795],[612,203],[879,117],[468,31],[633,570],[636,414],[611,129],[952,683],[529,233],[635,234],[819,219],[903,715],[306,47],[112,46],[479,286],[674,310],[908,504],[968,898],[589,183],[323,10],[962,612],[994,162],[740,432],[845,584],[611,184],[826,816],[524,309],[869,357],[694,625],[620,194],[789,370],[528,162],[689,467],[920,306],[633,278],[545,316],[591,288],[678,492],[286,179],[907,36],[882,102],[830,610],[991,40],[800,27],[800,792],[494,173],[704,467],[531,114],[377,367],[567,412],[892,301],[501,318],[301,173],[520,59],[832,773],[811,362],[898,297],[936,552],[194,139],[730,73],[889,723],[388,380],[917,389],[587,305],[640,571],[476,367],[646,643],[957,144],[633,218],[640,22],[709,47],[511,256],[800,678],[771,182],[399,92],[699,590],[969,747],[887,805],[678,17],[577,373],[392,316],[781,469],[834,542],[500,109],[696,430],[804,733],[433,132],[308,77],[745,129],[329,40],[847,19],[731,379],[621,152],[536,239],[953,105],[582,555],[227,222],[969,420],[967,696],[875,515],[874,275],[628,504],[333,143],[764,438],[229,128],[750,103],[674,79],[805,165],[874,454],[987,114],[480,436],[696,267],[347,294],[713,642],[596,546],[841,191],[762,721],[780,280],[142,27],[644,389],[682,300],[747,723],[798,663],[860,432],[415,126],[658,620],[107,65],[411,229],[828,732],[827,13],[833,256],[564,80],[745,514],[628,174],[358,234],[859,427],[826,290],[505,294],[796,299],[719,710],[568,294],[740,32],[966,493],[873,657],[323,23],[749,519],[517,456],[527,158],[345,94],[948,814],[683,133],[405,181],[829,544],[826,320],[836,701],[416,177],[565,228],[307,137],[966,456],[878,829],[476,162],[961,949],[993,908],[245,5],[601,106],[877,444],[914,490],[521,93],[983,656],[526,87],[818,796],[569,128],[569,421],[588,85],[839,587],[771,338],[880,790],[893,339],[690,128],[216,20],[877,88],[859,133],[528,230],[446,192],[258,229],[666,5],[769,19],[360,41],[795,196],[895,548],[804,462],[554,525],[228,155],[388,76],[356,190],[589,515],[842,637],[807,369],[610,439],[523,37],[485,469],[991,941],[618,382],[854,12],[718,37],[504,44],[414,92],[912,155],[926,706],[414,102],[127,119],[779,440],[618,582],[692,393],[412,230],[336,185],[979,941],[222,4],[798,271],[372,322],[730,593],[389,118],[964,469],[948,97],[897,264],[72,65],[486,326],[400,294],[808,208],[863,678],[979,254],[827,175],[629,418],[492,257],[795,188],[698,513],[566,556],[191,143],[940,900],[587,443],[925,398],[677,486],[136,13],[479,445],[608,338],[563,282],[304,116],[726,568],[727,178],[631,198],[681,216],[732,244],[955,539],[870,273],[844,743],[899,803],[874,718],[932,828],[958,839],[210,14],[823,724],[536,221],[230,107],[404,354],[743,321],[312,181],[776,419],[890,553],[193,192],[933,659],[635,126],[467,344],[571,145],[317,111],[835,112],[712,257],[970,554],[962,593],[138,90],[637,430],[374,261],[480,82],[968,679],[757,729],[915,426],[973,720],[970,6],[684,485],[393,7],[847,299],[742,573],[823,85],[287,182],[968,96],[982,364],[146,32],[594,537],[438,224],[305,295],[552,508],[992,543],[216,152],[934,829],[75,29],[368,322],[495,427],[488,135],[772,759],[983,349],[774,312],[792,789],[575,459],[693,355],[699,98],[481,424],[821,181],[571,56],[914,157],[930,829],[567,552],[475,458],[550,413],[993,523],[554,188],[571,390],[481,45],[228,110],[479,49],[541,417],[748,140],[761,63],[867,352],[838,734],[912,789],[975,595],[998,896],[639,608],[879,860],[864,790],[997,337],[986,404],[392,108],[603,451],[516,435],[457,174],[997,212],[968,961],[972,433],[954,291],[974,838],[616,535],[644,609],[802,570],[261,175],[914,867],[829,193],[775,145],[153,86],[890,91],[298,249],[885,719],[865,640],[869,522],[787,493],[934,563],[853,261],[465,326],[276,216],[832,216],[359,250],[702,265],[984,838],[499,393],[974,386],[169,94],[282,67],[557,124],[773,547],[118,73],[304,191],[654,357],[414,406],[472,426],[244,173],[999,133],[437,78],[610,380],[831,214],[825,114],[791,144],[526,25],[139,76],[393,295],[507,237],[271,30],[902,634],[950,590],[721,22],[854,653],[745,107],[776,527],[787,423],[966,461],[862,494],[549,77],[670,503],[562,66],[643,240],[970,863],[528,109],[840,57],[639,135],[173,165],[822,681],[966,272],[603,350],[900,817],[676,458],[350,279],[485,327],[921,116],[963,519],[851,435],[752,59],[984,538],[785,656],[997,144],[463,148],[842,264],[742,42],[357,292],[623,158],[999,179],[181,167],[878,388],[389,10],[446,170],[930,672],[824,183],[942,325],[935,26],[994,832],[178,94],[653,492],[525,452],[580,105],[635,28],[176,51],[672,194],[574,259],[977,378],[789,589],[321,198],[621,108],[917,560],[338,299],[246,23],[964,534],[215,150],[852,528],[909,760],[652,231],[889,35],[936,307],[383,171],[902,405],[885,517],[743,608],[950,589],[658,113],[985,233],[703,463],[818,641],[680,163],[700,658],[958,213],[894,368],[998,886],[314,142],[669,559],[757,681],[504,115],[827,759],[616,210],[485,71],[887,285],[321,276],[879,477],[328,273],[428,321],[745,563],[460,96],[636,93],[932,253],[634,179],[464,437],[424,150],[192,83],[568,422],[783,534],[565,286],[902,627],[716,505],[896,831],[921,450],[708,692],[824,368],[959,565],[551,532],[507,434],[957,898],[503,237],[458,398],[559,259],[837,349],[816,381],[848,69],[889,814],[528,392],[468,241],[893,793],[580,134],[948,843],[140,39],[389,69],[669,302],[511,418],[588,50],[741,474],[997,959],[917,199],[793,34],[679,541],[558,520],[128,48],[624,327],[907,95],[588,269],[648,590],[501,115],[429,280],[728,660],[629,472],[445,114],[125,47],[809,290],[947,229],[703,375],[796,472],[595,200],[540,153],[833,325],[572,115],[762,539],[830,472],[328,251],[465,54],[627,157],[118,10],[833,733],[745,684],[756,472],[984,926],[889,198],[853,669],[674,250],[710,402],[957,606],[439,127],[610,49],[317,234],[878,21],[622,299],[666,548],[697,529],[937,179],[184,164],[822,499],[538,417],[458,91],[901,701],[771,384],[871,765],[569,179],[313,19],[823,200],[58,28],[604,571],[947,801],[467,91],[936,723],[606,61],[661,138],[749,119],[374,294],[459,214],[821,275],[573,566],[538,347],[886,41],[324,6],[611,139],[836,768],[564,545],[584,95],[951,542],[693,624],[552,181],[169,85],[896,730],[990,463],[521,60],[786,607],[875,867],[611,186],[183,138],[990,121],[890,83],[479,311],[518,391],[812,570],[662,452],[980,60],[905,206],[833,73],[572,539],[826,388],[858,509],[872,757],[641,201],[905,19],[699,100],[795,416],[340,121],[980,78],[981,325],[483,139],[733,470],[986,469],[863,216],[773,496],[823,627],[727,666],[620,43],[877,57],[971,801],[306,105],[440,383],[923,535],[837,569],[728,41],[945,110],[723,341],[533,316],[835,627],[608,138],[364,320],[883,282],[846,637],[634,542],[760,576],[223,95],[432,8],[323,63],[224,85],[984,509],[873,834],[558,256],[951,728],[487,303],[947,180],[658,1],[823,815],[802,103],[620,84],[982,740],[884,625],[539,2],[773,17],[339,335],[685,243],[637,163],[807,161],[123,86],[924,617],[660,585],[971,245],[977,285],[714,642],[975,40],[535,21],[628,411],[249,35],[116,79],[693,583],[352,324],[685,237],[853,10],[510,167],[810,230],[995,896],[859,161],[792,90],[661,131],[894,583],[485,206],[409,295],[830,634],[539,163],[727,491],[950,67],[466,257],[962,120],[649,237],[978,662],[926,264],[393,331],[505,305],[901,404],[884,734],[727,563],[469,260],[826,349],[622,321],[899,831],[989,715],[968,695],[380,29],[491,31],[761,374],[616,29],[492,255],[650,113],[714,558],[794,190],[843,304],[882,791],[631,595],[715,582],[620,80],[952,229],[639,452],[448,202],[545,389],[634,79],[824,452],[776,12],[965,151],[848,759],[729,306],[944,206],[469,123],[429,45],[842,685],[406,320],[809,574],[647,284],[854,678],[416,342],[411,181],[802,398],[847,72],[901,778],[867,429],[833,272],[494,146],[847,481],[743,91],[693,208],[845,309],[281,279],[947,606],[871,319],[908,387],[560,206],[880,848],[384,382],[993,501],[836,31],[966,717],[983,872],[448,354],[900,131],[989,760],[724,38],[948,17],[548,70],[659,203],[640,433],[636,200],[926,628],[533,330],[694,202],[699,260],[728,473],[962,442],[986,789],[875,151],[731,239],[934,497],[320,148],[186,13],[810,365],[737,480],[382,280],[646,636],[901,628],[973,158],[852,639],[179,83],[957,464],[879,59],[629,57],[357,294],[936,796],[536,523],[238,158],[898,193],[914,592],[958,274],[977,711],[333,222],[965,693],[340,283],[892,846],[96,9],[574,101],[823,124],[816,673],[917,249],[643,242],[462,449],[602,46],[514,29],[725,305],[951,625],[903,182],[632,529],[859,340],[817,660],[630,485],[869,785],[932,88],[363,271],[771,203],[134,17],[614,581],[946,788],[897,200],[782,220],[726,626],[763,475],[871,91],[771,229],[690,336],[529,359],[500,59],[337,265],[929,768],[870,616],[741,433],[268,176],[622,517],[648,520],[882,168],[750,514],[944,459],[880,44],[967,745],[399,324],[785,290],[913,351],[904,764],[318,162],[622,550],[882,832],[744,656],[737,505],[927,218],[797,95],[910,385],[552,448],[335,94],[829,804],[470,370],[321,144],[266,10],[531,41],[806,651],[885,299],[908,190],[962,960],[946,653],[275,58],[386,261],[556,340],[917,330],[705,29],[855,97],[194,124],[759,615],[605,167],[953,810],[177,106],[625,435],[339,97],[827,80],[903,442],[754,146],[232,146],[987,932],[637,247],[879,241],[964,334],[347,247],[621,301],[976,230],[644,228],[942,435],[441,306],[580,161],[542,336],[554,349],[682,354],[784,645],[465,344],[544,189],[915,332],[837,465],[431,30],[705,390],[999,842],[631,221],[838,231],[690,506],[422,119],[623,337],[995,935],[695,151],[598,445],[833,772],[979,899],[867,717],[868,535],[339,85],[621,608],[968,592],[476,407],[437,197],[801,733],[207,51],[533,30],[347,111],[442,433],[825,735],[914,191],[765,333],[415,257],[275,122],[811,304],[793,114],[726,518],[248,188],[614,75],[901,238],[540,342],[983,40],[913,681],[614,150],[651,146],[612,17],[798,670],[864,673],[477,336],[766,209],[505,364],[778,665],[929,272],[816,630],[973,875],[849,815],[780,373],[475,204],[791,532],[841,295],[663,117],[784,34],[607,469],[916,283],[530,377],[964,271],[813,517],[800,313],[142,55],[431,67],[771,671],[844,733],[835,449],[360,356],[976,212],[844,469],[821,683],[162,92],[221,156],[547,380],[903,138],[736,574],[989,344],[555,413],[509,466],[902,572],[865,134],[946,353],[738,723],[930,471],[939,306],[502,359],[955,650],[676,184],[997,965],[775,570],[413,16],[799,70],[527,326],[706,41],[768,256],[759,679],[987,350],[492,268],[529,351],[486,296],[849,376],[512,493],[892,778],[829,708],[987,125],[998,433],[762,275],[431,248],[604,201],[859,368],[819,486],[720,565],[411,68],[902,561],[788,154],[905,4],[933,763],[748,581],[702,394],[860,633],[407,141],[670,625],[417,191],[954,456],[438,265],[645,187],[618,443],[848,51],[182,52],[673,310],[884,260],[376,68],[989,292],[794,138],[928,336],[404,285],[142,123],[333,185],[684,400],[668,76],[534,269],[564,284],[625,29],[950,170],[818,519],[642,522],[744,376],[540,289],[500,314],[903,858],[331,62],[736,360],[995,269],[926,560],[711,225],[583,125],[249,147],[655,392],[343,25],[611,21],[893,493],[877,745],[106,10],[949,751],[847,708],[880,433],[733,600],[429,336],[468,172],[927,597],[585,39],[262,215],[864,12],[758,153],[746,579],[896,589],[504,91],[693,241],[399,38],[817,494],[965,160],[524,323],[626,480],[666,336],[981,200],[695,586],[469,264],[299,24],[874,608],[745,125],[449,153],[374,366],[760,300],[838,149],[350,254],[930,85],[968,939],[956,386],[58,33],[914,341],[125,111],[812,808],[630,368],[781,608],[621,318],[948,446],[991,299],[924,695],[228,153],[631,268],[886,850],[808,230],[679,279],[831,567],[971,503],[554,456],[536,212],[629,552],[704,498],[383,160],[524,445],[206,137],[905,640],[855,468],[839,832],[409,347],[932,394],[860,845],[453,155],[439,41],[850,280],[668,558],[709,587],[789,348],[646,268],[489,234],[459,186],[455,222],[175,133],[314,292],[243,96],[911,884],[880,384],[792,324],[774,429],[384,38],[874,265],[494,417],[851,465],[738,343],[121,76],[838,307],[853,557],[937,734],[472,324],[643,478],[959,183],[859,343],[565,327],[849,718],[92,16],[461,420],[442,58],[676,120],[613,612],[579,382],[994,783],[922,827],[729,672],[956,680],[704,38],[395,102],[473,423],[534,124],[445,99],[554,198],[809,380],[719,607],[750,277],[361,268],[791,95],[636,621],[33,19],[737,585],[678,638],[364,155],[267,150],[744,94],[838,781],[514,166],[111,102],[914,678],[405,68],[403,24],[446,270],[407,68],[639,444],[731,113],[306,35],[936,783],[850,140],[865,837],[804,745],[617,580],[544,65],[860,496],[46,0],[900,760],[585,252],[754,742],[661,227],[663,573],[862,25],[734,106],[467,105],[716,440],[622,57],[288,52],[809,799],[306,82],[736,204],[868,624],[884,775],[962,482],[466,194],[552,321],[914,828],[963,506],[870,86],[155,95],[959,497],[520,350],[262,49],[763,493],[665,595],[325,317],[563,58],[749,510],[736,432],[237,86],[543,109],[776,663],[731,302],[696,441],[822,440],[873,132],[936,886],[347,0],[609,562],[675,304],[628,615],[494,180],[418,59],[732,507],[897,45],[776,636],[567,325],[375,84],[982,406],[291,115],[920,354],[576,259],[731,41],[914,715],[930,91],[871,81],[366,21],[783,388],[778,730],[953,881],[563,425],[968,366],[524,470],[896,480],[899,148],[928,379],[900,595],[487,460],[680,570],[806,420],[892,731],[713,170],[876,283],[749,235],[647,500],[656,172],[199,22],[984,835],[539,21],[853,196],[738,631],[652,53],[991,263],[706,87],[841,17],[801,484],[501,237],[890,643],[751,715],[657,596],[324,52],[863,659],[283,178],[250,56],[842,301],[182,40],[728,46],[489,100],[878,523],[584,137],[879,859],[862,849],[919,38],[879,140],[885,658],[385,376],[742,313],[913,207],[752,7],[953,572],[687,124],[810,357],[564,468],[435,217],[997,168],[587,89],[603,430],[726,331],[456,394],[811,312],[775,4],[781,726],[901,880],[739,410],[329,260],[339,169],[365,232],[623,93],[753,333],[250,43],[397,121],[728,392],[904,283],[881,780],[693,489],[815,205],[449,221],[956,325],[947,843],[931,888],[825,7],[368,2],[742,421],[453,251],[968,506],[706,102],[620,337],[604,427],[796,634],[636,599],[537,370],[508,178],[216,107],[944,746],[694,453],[806,444],[580,511],[563,476],[824,697],[556,170],[399,309],[925,340],[520,502],[567,429],[411,32],[529,211],[870,632],[82,11],[581,576],[798,540],[720,114],[394,373],[824,692],[317,274],[690,153],[528,96],[655,524],[967,268],[517,499],[953,372],[539,113],[964,852],[552,186],[420,340],[958,501],[963,63],[555,206],[877,604],[632,297],[433,44],[154,23],[531,134],[325,299],[820,783],[980,348],[230,154],[649,550],[982,292],[421,292],[721,431],[950,636],[428,6],[718,33],[676,53],[715,658],[795,309],[727,265],[876,128],[561,310],[848,106],[927,394],[994,377],[714,476],[794,669],[360,232],[729,28],[315,119],[722,376],[461,104],[470,394],[960,703],[716,358],[557,116],[685,284],[305,148],[261,39],[995,203],[522,521],[753,420],[846,463],[485,366],[541,523],[174,94],[792,424],[827,571],[877,199],[767,412],[966,876],[632,21],[544,385],[748,184],[513,432],[841,572],[663,393],[823,534],[685,606],[447,298],[158,114],[828,483],[444,406],[929,648],[683,546],[894,420],[802,258],[536,462],[539,452],[946,268],[848,788],[718,598],[740,277],[976,891],[716,56],[804,602],[264,44],[355,293],[446,272],[944,207],[398,397],[844,236],[658,79],[909,443],[683,676],[872,67],[894,384],[881,369],[233,167],[863,747],[881,416],[867,289],[983,590],[972,297],[556,61],[970,578],[543,358],[910,216],[759,499],[791,9],[851,143],[915,866],[740,286],[313,105],[848,687],[753,232],[797,768],[892,388],[41,26],[391,289],[405,280],[824,732],[354,188],[956,779],[718,437],[576,511],[410,167],[170,142],[900,568],[433,200],[817,428],[729,706],[871,202],[303,242],[728,303],[644,207],[429,172],[784,114],[748,439],[895,269],[911,202],[707,248],[294,74],[745,283],[362,128],[743,454],[923,13],[647,174],[534,279],[676,129],[839,505],[564,518],[736,709],[523,232],[872,515],[911,781],[722,178],[890,266],[990,458],[867,817],[731,114],[506,333],[907,794],[943,51],[494,309],[894,661],[618,37],[215,100],[464,32],[242,19],[225,222],[996,682],[610,91],[553,327],[965,431],[245,63],[630,255],[980,545],[624,0],[790,647],[784,335],[967,417],[964,69],[305,199],[307,249],[748,414],[801,608],[417,181],[652,356],[395,314],[587,499],[355,159],[713,228],[369,183],[949,195],[950,171],[908,166],[763,750],[846,403],[720,175],[966,183],[419,393],[550,179],[660,360],[945,144],[822,131],[722,646],[476,160],[887,685],[615,586],[94,48],[102,50],[893,150],[888,698],[827,174],[936,784],[740,714],[888,431],[394,328],[844,213],[555,245],[742,648],[462,19],[521,71],[567,269],[624,170],[595,359],[961,334],[918,599],[758,545],[659,376],[927,17],[97,55],[471,240],[713,86],[723,334],[862,650],[788,695],[653,272],[838,439],[524,432],[732,364],[503,241],[708,694],[761,659],[605,148],[727,448],[724,427],[295,26],[969,269],[967,541],[712,429],[918,418],[898,673],[707,444],[966,67],[785,34],[710,527],[891,757],[820,430],[923,849],[843,537],[515,300],[926,463],[713,650],[726,586],[892,682],[209,159],[870,236],[796,795],[738,172],[993,447],[945,93],[659,520],[316,79],[501,47],[226,57],[442,178],[886,360],[876,544],[895,622],[994,959],[500,463],[957,594],[254,78],[988,629],[158,89],[604,13],[922,602],[650,407],[609,9],[584,138],[792,664],[433,156],[639,76],[983,479],[890,500],[651,533],[251,119],[358,146],[987,285],[485,53],[768,217],[435,249],[950,437],[404,200],[572,256],[51,38],[583,540],[914,694],[734,690],[954,792],[266,68],[605,123],[406,179],[510,156],[510,184],[597,346],[364,300],[998,371],[649,284],[850,838],[429,247],[733,661],[844,468],[974,942],[63,53],[637,435],[626,383],[984,246],[686,105],[761,53],[320,102],[987,732],[793,24],[249,159],[390,97],[333,282],[871,604],[986,753],[425,383],[613,553],[741,407],[570,462],[607,133],[786,55],[879,610],[916,453],[744,61],[751,402],[638,561],[979,882],[133,66],[359,59],[844,801],[533,243],[919,205],[618,259],[745,188],[989,277],[608,320],[903,248],[630,376],[322,61],[273,113],[771,503],[457,403],[767,89],[722,241],[554,404],[525,204],[964,340],[494,55],[581,72],[375,130],[437,341],[987,804],[785,482],[937,486],[767,492],[913,475],[579,226],[984,797],[193,55],[443,342],[485,369],[750,709],[597,376],[549,118],[855,463],[845,688],[882,212],[787,518],[822,819],[766,541],[782,613],[464,56],[727,518],[859,519],[585,218],[479,92],[881,202],[913,403],[893,141],[882,417],[871,836],[839,224],[652,532],[755,654],[912,336],[893,732],[968,499],[726,146],[884,520],[986,700],[963,14],[474,293],[408,21],[819,622],[468,442],[400,211],[702,34],[245,164],[915,100],[873,431],[952,562],[139,23],[492,269],[357,70],[613,344],[957,83],[983,138],[917,36],[745,399],[943,330],[102,69],[259,146],[602,447],[872,20],[697,132],[479,57],[799,101],[991,220],[948,371],[997,592],[830,77],[956,560],[984,525],[619,294],[658,626],[925,284],[790,201],[820,253],[864,681],[571,356],[307,169],[662,409],[870,610],[777,693],[183,182],[849,332],[754,229],[302,193],[715,360],[807,526],[551,485],[771,69],[479,275],[764,137],[928,580],[150,99],[919,764],[858,124],[883,610],[972,378],[762,133],[415,319],[909,168],[651,581],[819,366],[578,262],[79,63],[813,508],[404,32],[238,159],[525,441],[766,358],[800,561],[969,272],[659,274],[496,430],[274,11],[919,539],[573,414],[848,194],[924,673],[862,244],[828,292],[556,102],[658,224],[674,208],[416,412],[324,96],[919,697],[688,54],[897,702],[579,351],[51,15],[931,38],[544,106],[638,92],[344,297],[327,44],[545,497],[978,424],[541,87],[567,197],[886,529],[982,137],[774,218],[906,59],[664,81],[511,346],[602,478],[201,163],[797,426],[991,356],[380,254],[361,172],[792,667],[952,260],[127,123],[382,143],[459,370],[895,418],[773,171],[329,31],[630,166],[618,360],[484,222],[361,281],[869,609],[972,795],[698,689],[699,152],[290,123],[927,586],[812,320],[705,280],[111,39],[507,221],[624,289],[510,193],[715,354],[356,3],[92,26],[577,422],[546,121],[36,13],[856,323],[705,312],[479,303],[945,837],[865,166],[306,248],[316,87],[630,140],[770,667],[350,143],[794,463],[391,43],[686,321],[471,58],[553,187],[489,51],[286,158],[715,273],[684,70],[664,619],[782,34],[859,267],[982,666],[465,421],[753,639],[859,766],[688,282],[914,107],[283,31],[892,62],[776,624],[399,215],[751,117],[610,311],[281,187],[767,717],[970,146],[319,221],[420,16],[460,149],[874,807],[772,191],[850,264],[286,23],[351,290],[995,710],[842,242],[732,363],[919,566],[828,760],[872,786],[789,7],[894,456],[619,221],[292,129],[716,324],[587,426],[928,444],[795,702],[536,516],[662,76],[766,594],[622,168],[319,215],[497,347],[852,612],[790,60],[939,842],[849,169],[832,186],[990,939],[842,491],[771,9],[817,744],[383,111],[645,315],[527,79],[659,208],[775,73],[428,286],[804,287],[459,108],[775,515],[275,139],[652,364],[744,377],[803,126],[426,348],[733,297],[808,218],[981,536],[761,321],[809,322],[584,446],[384,134],[892,230],[866,429],[323,198],[719,239],[946,4],[255,209],[581,411],[703,587],[839,288],[278,6],[902,881],[506,87],[516,219],[841,816],[833,495],[148,70],[441,254],[945,464],[628,86],[277,244],[538,195],[936,481],[61,47],[675,253],[837,503],[266,42],[490,340],[294,220],[193,149],[335,173],[204,48],[922,592],[370,191],[958,48],[400,340],[989,347],[435,263],[769,718],[699,612],[524,256],[845,630],[938,304],[88,31],[442,219],[763,624],[939,429],[234,146],[978,651],[874,854],[465,4],[799,409],[739,14],[853,70],[997,525],[719,113],[880,524],[847,340],[232,83],[829,147],[696,384],[739,577],[666,602],[570,245],[722,325],[569,319],[653,271],[249,152],[810,46],[627,184],[408,236],[335,125],[741,623],[385,186],[788,385],[975,476],[615,9],[271,202],[658,427],[924,342],[710,350],[656,142],[909,831],[693,479],[816,273],[875,276],[824,507],[426,329],[611,313],[776,63],[828,607],[994,288],[154,11],[662,611],[668,578],[716,640],[591,310],[917,673],[121,78],[472,152],[863,242],[699,137],[454,226],[961,189],[631,252],[916,367],[880,119],[193,189],[738,327],[516,25],[249,51],[934,413],[354,221],[873,152],[959,819],[220,122],[322,251],[645,365],[468,189],[632,152],[450,427],[443,347],[374,300],[704,636],[620,405],[937,232],[986,174],[430,117],[805,295],[294,170],[542,272],[873,298],[834,204],[943,155],[775,182],[816,155],[670,241],[241,33],[913,332],[765,691],[477,127],[996,402],[501,427],[819,416],[471,368],[630,152],[743,355],[515,93],[988,835],[511,223],[931,449],[562,231],[963,20],[491,170],[763,331],[999,990],[605,22],[268,256],[643,469],[626,519],[419,284],[972,277],[917,778],[964,900],[594,532],[769,756],[810,784],[688,607],[770,78],[896,794],[757,662],[670,665],[699,591],[796,548],[995,556],[984,739],[950,707],[689,656],[946,714],[938,294],[934,415],[820,150],[437,70],[680,560],[877,601],[924,547],[915,18],[570,375],[598,243],[218,137],[363,64],[353,103],[873,685],[901,697],[957,900],[745,150],[734,282],[557,277],[839,718],[990,723],[250,51],[597,249],[986,800],[796,771],[908,471],[253,56],[716,297],[158,29],[748,501],[918,911],[821,109],[707,38],[838,472],[625,317],[408,333],[561,135],[626,308],[825,776],[331,232],[665,269],[958,458],[363,208],[999,461],[719,5],[415,204],[338,310],[654,628],[61,10],[916,551],[812,349],[49,6],[645,298],[721,662],[770,740],[992,767],[853,817],[765,250],[756,670],[988,183],[415,198],[870,76],[829,369],[537,491],[884,860],[767,613],[267,43],[77,5],[834,299],[715,79],[954,511],[688,463],[922,297],[811,225],[275,248],[480,262],[944,520],[962,895],[928,434],[429,134],[324,192],[918,219],[953,459],[253,234],[798,0],[403,209],[772,120],[465,106],[533,392],[529,256],[622,372],[820,504],[473,332],[312,282],[613,185],[700,695],[390,94],[693,503],[715,251],[730,568],[679,408],[995,170],[724,547],[838,31],[913,512],[987,247],[879,131],[371,314],[405,366],[865,660],[921,694],[836,80],[792,756],[670,331],[997,217],[484,228],[700,328],[486,110],[911,289],[446,396],[642,421],[461,219],[577,508],[803,471],[306,293],[480,277],[942,200],[432,151],[686,618],[706,502],[794,615],[153,4],[877,6],[671,324],[855,437],[225,115],[897,259],[611,426],[665,289],[983,276],[531,139],[246,89],[985,473],[393,125],[813,561],[227,52],[982,828],[711,591],[734,672],[378,67],[728,388],[809,115],[976,785],[837,152],[489,7],[643,414],[338,290],[421,220],[790,54],[527,495],[703,700],[492,254],[649,314],[436,102],[770,674],[812,693],[345,63],[833,177],[524,127],[975,390],[683,138],[615,70],[445,239],[611,110],[759,24],[325,149],[692,117],[495,129],[957,453],[940,478],[843,96],[878,840],[291,269],[280,5],[423,39],[725,440],[896,334],[410,10],[888,90],[854,620],[789,145],[889,293],[948,37],[278,121],[478,285],[47,40],[578,145],[661,38],[608,463],[342,328],[574,248],[697,169],[613,264],[505,387],[643,126],[591,88],[750,643],[802,70],[837,364],[846,63],[188,17],[633,451],[880,653],[949,30],[975,861],[849,658],[567,423],[625,196],[863,412],[943,354],[914,517],[588,516],[607,216],[335,65],[555,14],[797,57],[474,230],[973,953],[947,261],[258,244],[339,266],[604,159],[921,837],[734,263],[218,55],[605,114],[997,156],[789,101],[412,318],[431,193],[229,66],[514,346],[245,207],[934,129],[741,721],[691,10],[116,29],[640,71],[337,116],[247,10],[569,67],[765,381],[886,575],[898,165],[492,237],[597,371],[183,117],[684,467],[402,228],[571,385],[877,872],[971,95],[789,3],[877,670],[457,99],[436,65],[526,356],[359,112],[795,506],[379,65],[246,104],[533,211],[362,211],[140,118],[327,247],[295,243],[808,273],[823,662],[585,285],[895,366],[717,89],[608,534],[704,254],[680,169],[961,135],[756,77],[912,683],[773,95],[872,796],[319,293],[966,893],[831,594],[790,381],[222,11],[492,160],[985,44],[390,49],[490,24],[966,780],[340,92],[842,493],[499,346],[593,279],[892,10],[157,146],[466,275],[244,184],[617,34],[818,242],[358,62],[849,436],[608,6],[944,667],[340,98],[896,627],[882,694],[467,385],[781,322],[877,858],[452,243],[749,684],[623,350],[275,85],[783,427],[985,122],[932,127],[911,286],[933,26],[891,533],[689,560],[918,294],[970,4],[735,226],[905,119],[975,529],[913,307],[977,686],[527,36],[827,645],[300,268],[654,523],[887,86],[792,233],[968,947],[718,305],[610,218],[755,568],[637,403],[987,406],[928,699],[664,172],[978,422],[928,641],[608,253],[891,559],[688,83],[698,206],[706,112],[473,54],[974,590],[477,170],[579,3],[413,277],[874,745],[313,134],[929,601],[843,540],[870,744],[924,309],[147,99],[548,298],[679,192],[469,329],[324,72],[855,643],[818,807],[419,147],[373,305],[352,52],[611,33],[820,697],[740,175],[589,207],[650,253],[974,123],[500,100],[594,422],[896,869],[795,685],[688,455],[661,640],[258,100],[678,194],[563,99],[778,103],[772,351],[415,196],[437,365],[500,493],[864,321],[779,222],[918,229],[955,675],[583,319],[291,121],[508,67],[866,73],[770,713],[944,691],[615,590],[698,682],[997,923],[579,320],[720,585],[304,254],[868,389],[364,156],[95,88],[678,110],[876,243],[795,110],[372,64],[359,210],[548,500],[386,159],[822,287],[362,43],[934,749],[589,348],[761,306],[946,314],[389,47],[949,831],[689,374],[923,640],[597,189],[842,426],[847,799],[502,499],[336,224],[859,298],[332,23],[960,912],[415,384],[688,606],[335,156],[301,76],[555,225],[749,196],[828,432],[498,349],[506,241],[599,27],[922,784],[837,140],[835,293],[748,230],[930,159],[976,587],[562,436],[819,600],[93,1],[561,379],[512,39],[612,286],[927,636],[858,365],[369,208],[872,754],[287,52],[530,507],[533,409],[862,109],[954,609],[237,209],[923,199],[837,480],[630,76],[736,211],[104,55],[774,689],[361,313],[808,179],[902,780],[839,51],[678,173],[956,384],[656,539],[806,36],[671,281],[795,486],[879,636],[957,39],[512,201],[602,328],[710,517],[743,494],[864,842],[986,257],[684,166],[480,420],[742,493],[696,691],[420,165],[774,291],[718,665],[954,11],[928,873],[738,439],[573,510],[110,46],[271,37],[405,312],[131,42],[930,489],[713,99],[497,229],[963,143],[844,101],[831,285],[744,286],[710,120],[862,394],[885,753],[623,566],[336,215],[939,149],[779,414],[609,600],[849,666],[679,128],[795,98],[928,417],[701,54],[919,828],[140,83],[712,307],[486,265],[183,141],[509,441],[498,194],[487,223],[718,704],[810,33],[945,401],[524,145],[975,544],[613,440],[805,369],[206,32],[771,480],[701,196],[376,301],[974,13],[967,580],[597,391],[512,502],[945,555],[492,347],[902,802],[931,129],[444,344],[930,917],[629,396],[997,477],[496,469],[345,244],[984,639],[899,18],[346,93],[279,88],[785,684],[265,27],[791,348],[988,793],[980,685],[772,729],[164,64],[859,688],[347,101],[524,46],[495,135],[751,323],[679,376],[568,439],[459,378],[655,367],[496,251],[867,742],[763,158],[221,187],[672,0],[712,355],[952,893],[657,165],[411,82],[969,5],[415,152],[937,879],[742,3],[853,632],[941,819],[949,583],[924,74],[875,514],[946,454],[982,834],[792,234],[645,133],[413,321],[879,459],[449,178],[155,16],[884,356],[846,394],[271,152],[674,148],[894,652],[914,408],[562,443],[392,265],[394,135],[662,610],[633,217],[781,656],[620,418],[632,445],[787,250],[745,721],[467,178],[474,12],[641,84],[487,299],[785,159],[791,138],[696,598],[396,165],[956,219],[890,13],[472,28],[670,197],[461,422],[848,839],[921,168],[589,102],[290,19],[435,281],[181,0],[438,358],[966,802],[850,804],[764,154],[936,65],[244,146],[963,844],[979,411],[819,114],[649,88],[796,465],[841,419],[108,4],[760,524],[982,570],[635,429],[850,407],[470,253],[351,320],[281,216],[925,697],[988,538],[667,347],[949,150],[924,28],[370,332],[517,149],[842,303],[326,217],[936,340],[303,263],[508,219],[654,525],[519,463],[786,395],[934,231],[736,129],[755,521],[928,539],[503,286],[766,60],[763,360],[711,594],[806,465],[851,199],[819,581],[932,240],[810,519],[205,199],[201,162],[430,277],[912,656],[601,172],[902,469],[203,63],[912,815],[866,822],[745,92],[378,74],[631,342],[708,22],[558,23],[323,84],[665,170],[998,407],[591,155],[375,61],[770,634],[753,239],[292,138],[593,311],[323,255],[233,131],[722,484],[593,70],[539,334],[762,759],[826,471],[835,329],[632,141],[473,107],[856,136],[346,296],[857,214],[895,505],[299,273],[399,95],[429,64],[848,736],[771,746],[893,362],[717,411],[414,214],[349,126],[332,54],[910,797],[910,566],[283,49],[668,94],[657,132],[909,881],[886,669],[744,305],[403,386],[622,303],[687,150],[757,735],[899,135],[320,187],[561,92],[521,248],[368,1],[501,476],[828,678],[579,52],[585,583],[755,471],[360,200],[890,509],[589,246],[346,211],[488,77],[910,270],[189,161],[607,38],[930,410],[814,78],[578,230],[162,45],[552,551],[618,544],[813,280],[893,255],[812,665],[505,274],[870,451],[797,242],[621,582],[973,824],[617,616],[254,36],[748,256],[643,611],[490,408],[517,286],[884,368],[696,233],[973,219],[656,9],[649,362],[807,121],[294,230],[631,70],[549,331],[851,236],[135,60],[818,601],[96,15],[531,281],[880,270],[905,230],[518,494],[608,524],[394,306],[920,241],[419,328],[872,205],[463,56],[725,533],[938,851],[5,0],[459,324],[914,497],[398,269],[428,80],[798,495],[335,10],[469,415],[700,303],[243,98],[450,428],[372,73],[246,196],[713,572],[811,212],[678,360],[399,300],[891,183],[128,72],[990,940],[828,616],[598,517],[987,863],[808,487],[919,575],[347,133],[597,82],[454,132],[554,407],[430,131],[512,240],[483,356],[771,228],[555,142],[169,26],[595,98],[627,502],[968,888],[909,769],[826,292],[816,179],[983,310],[698,118],[322,210],[488,4],[356,260],[885,112],[477,12],[854,161],[671,322],[76,73],[458,113],[597,8],[269,265],[681,550],[965,455],[555,333],[882,504],[988,801],[761,301],[515,459],[881,9],[584,442],[941,263],[833,346],[720,630],[669,223],[785,734],[828,246],[692,168],[982,410],[488,169],[970,656],[653,295],[874,185],[483,254],[991,819],[186,8],[405,208],[281,51],[736,361],[892,275],[798,591],[896,359],[367,46],[823,69],[239,205],[740,215],[434,25],[821,287],[906,903],[836,34],[447,252],[463,336],[838,349],[456,413],[878,856],[511,464],[568,25],[427,16],[758,69],[701,4],[865,632],[269,32],[610,315],[891,882],[722,438],[464,14],[557,31],[918,408],[647,553],[514,81],[720,552],[238,62],[611,301],[602,149],[862,230],[336,178],[542,366],[745,270],[959,825],[825,288],[713,334],[482,106],[968,133],[786,107],[690,633],[573,140],[488,138],[777,726],[919,431],[768,438],[806,185],[697,47],[270,56],[735,525],[847,552],[591,232],[666,186],[639,318],[740,427],[387,262],[845,826],[821,374],[697,358],[815,356],[969,295],[40,23],[696,656],[962,516],[460,99],[618,155],[389,28],[136,127],[719,612],[916,6],[605,310],[388,69],[972,205],[701,621],[872,347],[792,130],[442,101],[575,399],[472,248],[630,544],[978,942],[990,351],[823,491],[800,131],[888,113],[381,159],[381,82],[926,911],[887,837],[862,261],[581,294],[969,382],[858,558],[812,36],[856,815],[894,636],[827,204],[284,136],[839,351],[909,211],[628,196],[909,903],[796,514],[905,755],[822,749],[487,228],[720,224],[975,378],[927,501],[621,590],[274,195],[634,195],[280,187],[545,153],[892,453],[760,517],[840,65],[532,181],[950,47],[526,221],[892,677],[427,313],[435,169],[979,192],[945,271],[612,576],[727,106],[996,670],[543,427],[885,766],[345,18],[181,109],[994,905],[524,462],[888,606],[803,426],[625,495],[553,110],[493,188],[784,325],[332,173],[974,327],[787,376],[290,27],[722,469],[205,13],[958,122],[678,563],[380,7],[668,539],[599,480],[642,438],[559,42],[198,78],[914,379],[455,413],[874,17],[696,282],[758,486],[96,79],[924,814],[745,166],[614,380],[154,79],[715,148],[893,769],[658,314],[908,507],[998,225],[905,465],[645,369],[309,10],[764,12],[901,647],[660,22],[886,418],[580,537],[988,630],[973,757],[613,332],[957,678],[891,547],[531,354],[944,62],[966,804],[524,172],[99,94],[769,284],[721,180],[285,136],[944,828],[954,503],[844,334],[943,198],[772,297],[433,406],[751,399],[711,676],[664,638],[717,57],[625,191],[740,623],[912,843],[742,57],[625,170],[510,46],[713,44],[938,243],[940,355],[448,174],[690,31],[929,162],[694,508],[897,857],[752,341],[516,267],[804,715],[825,488],[982,400],[957,12],[954,475],[866,738],[992,244],[317,135],[680,542],[894,815],[534,219],[911,25],[912,448],[693,420],[539,330],[805,615],[501,205],[354,231],[950,818],[640,92],[739,541],[758,305],[844,65],[910,35],[905,757],[681,173],[430,422],[664,64],[707,548],[840,266],[480,367],[648,70],[605,284],[691,61],[367,229],[904,728],[568,26],[878,629],[546,153],[341,146],[844,261],[880,124],[347,237],[683,287],[758,103],[997,410],[155,42],[860,395],[457,304],[849,109],[881,821],[890,559],[573,400],[776,288],[273,206],[443,299],[336,300],[875,667],[494,353],[947,196],[936,429],[991,446],[410,92],[647,119],[978,193],[850,75],[668,209],[460,127],[661,351],[778,414],[553,536],[776,720],[887,862],[265,223],[797,273],[942,855],[440,431],[694,258],[942,313],[909,680],[455,50],[629,489],[472,243],[269,13],[866,144],[994,660],[709,314],[582,202],[430,231],[734,324],[376,284],[851,717],[614,503],[805,763],[243,106],[647,354],[408,167],[168,40],[736,214],[890,333],[875,503],[72,28],[480,448],[956,721],[894,426],[722,585],[435,283],[950,48],[835,682],[606,149],[555,168],[782,690],[852,529],[804,181],[519,336],[197,153],[463,337],[643,50],[867,447],[453,312],[878,68],[218,105],[450,288],[510,360],[691,279],[760,346],[754,543],[328,58],[971,383],[555,509],[733,147],[551,70],[928,350],[463,385],[849,635],[436,136],[429,153],[942,848],[691,378],[890,131],[900,824],[837,127],[155,93],[526,80],[503,6],[832,14],[711,28],[784,113],[816,134],[772,34],[742,9],[175,20],[398,47],[813,111],[359,268],[678,561],[908,224],[624,270],[715,171],[869,781],[34,28],[688,33],[540,49],[786,103],[907,763],[551,346],[910,881],[870,662],[365,304],[492,161],[716,50],[468,455],[915,885],[294,265],[933,360],[808,565],[383,190],[421,284],[991,561],[463,388],[754,93],[949,231],[914,522],[929,91],[863,248],[881,634],[405,117],[855,303],[995,239],[316,66],[235,40],[605,229],[966,619],[860,174],[410,34],[484,108],[360,183],[938,500],[726,432],[488,141],[822,73],[718,637],[721,140],[498,306],[352,128],[145,33],[303,17],[701,375],[653,412],[917,727],[777,386],[700,543],[666,273],[847,347],[860,390],[711,172],[239,150],[419,186],[898,370],[902,849],[366,260],[165,39],[766,321],[398,255],[779,192],[324,256],[402,176],[998,612],[881,166],[394,142],[862,564],[575,241],[771,112],[620,238],[773,127],[458,293],[789,515],[855,75],[786,155],[745,328],[956,373],[289,80],[922,742],[335,168],[487,181],[633,615],[112,41],[550,400],[306,207],[635,570],[784,64],[874,464],[825,129],[786,453],[518,410],[974,106],[971,686],[503,405],[977,786],[441,173],[257,58],[658,317],[380,196],[580,432],[494,51],[604,300],[889,680],[692,235],[792,107],[684,457],[282,108],[806,259],[260,48],[802,445],[319,85],[516,155],[346,224],[828,53],[760,530],[441,231],[910,559],[670,18],[913,57],[329,248],[723,91],[512,362],[628,61],[981,202],[971,140],[809,339],[329,209],[906,701],[981,523],[958,735],[664,216],[690,83],[999,740],[662,36],[852,156],[373,244],[130,0],[521,307],[210,113],[932,407],[771,443],[534,216],[667,190],[629,125],[909,93],[674,239],[489,137],[851,534],[755,34],[266,0],[621,585],[816,432],[629,198],[639,222],[715,13],[376,274],[161,113],[567,141],[563,117],[484,419],[465,17],[901,97],[538,475],[582,410],[793,540],[897,704],[230,58],[283,33],[318,57],[412,105],[491,261],[893,739],[903,16],[941,789],[766,715],[983,186],[531,448],[608,91],[347,286],[175,169],[978,755],[773,690],[631,73],[516,12],[635,633],[735,548],[37,25],[325,171],[917,134],[135,120],[658,284],[623,288],[420,41],[596,290],[773,427],[515,345],[291,211],[810,466],[783,149],[957,655],[505,363],[287,284],[694,66],[642,198],[926,13],[918,906],[855,741],[910,704],[883,716],[815,663],[909,286],[721,559],[653,545],[463,266],[338,212],[882,272],[287,267],[701,506],[559,338],[854,141],[442,46],[529,52],[746,641],[732,490],[780,751],[969,145],[740,696],[452,72],[144,65],[427,236],[974,722],[659,434],[602,269],[952,882],[614,285],[913,295],[669,40],[360,211],[927,626],[910,161],[846,755],[383,300],[580,270],[945,198],[902,896],[888,600],[597,496],[972,434],[701,424],[527,101],[558,426],[472,321],[210,102],[529,199],[808,761],[933,823],[551,276],[827,630],[510,116],[500,278],[413,257],[867,4],[377,39],[928,898],[979,423],[988,492],[937,174],[919,127],[912,203],[755,704],[433,302],[509,485],[729,3],[135,24],[855,758],[340,135],[538,521],[490,69],[879,222],[215,148],[893,230],[705,49],[746,385],[727,336],[819,48],[283,144],[605,434],[957,651],[824,511],[694,382],[987,750],[524,431],[297,98],[245,104],[907,108],[412,257],[771,413],[367,318],[792,459],[800,378],[744,191],[922,631],[413,96],[510,247],[793,704],[105,0],[991,66],[668,220],[620,281],[586,263],[505,263],[813,406],[334,28],[833,420],[449,50],[671,161],[580,103],[737,664],[577,324],[758,95],[909,249],[235,25],[563,214],[767,62],[665,363],[583,372],[980,5],[147,132],[512,224],[685,422],[559,490],[589,38],[989,224],[357,200],[708,225],[403,184],[799,226],[673,0],[966,583],[674,564],[702,468],[452,329],[357,90],[643,277],[684,404],[572,59],[516,298],[211,141],[867,497],[430,87],[532,252],[961,575],[685,649],[838,688],[978,246],[967,267],[685,468],[427,356],[617,262],[984,731],[986,258],[685,99],[782,151],[736,153],[199,53],[639,146],[663,545],[161,61],[903,216],[652,43],[637,63],[260,33],[968,494],[547,499],[343,229],[505,348],[842,360],[192,15],[148,51],[982,921],[561,25],[460,163],[980,731],[824,437],[711,287],[980,66],[484,397],[236,80],[474,131],[763,462],[653,429],[307,95],[676,22],[514,352],[988,487],[273,53],[540,266],[905,620],[939,464],[767,469],[469,349],[781,416],[517,74],[800,357],[455,166],[796,208],[391,87],[932,260],[971,966],[410,386],[422,370],[858,139],[205,48],[426,316],[404,294],[780,247],[768,461],[461,19],[375,1],[506,206],[479,317],[784,667],[171,38],[849,261],[864,776],[609,342],[446,361],[926,219],[896,295],[643,202],[873,490],[853,500],[695,398],[707,355],[430,392],[137,25],[886,326],[813,771],[697,385],[818,649],[483,442],[837,335],[753,512],[273,6],[259,100],[906,174],[792,432],[760,268],[739,481],[852,742],[651,300],[677,249],[562,337],[716,223],[805,446],[935,401],[352,201],[542,77],[666,116],[939,681],[973,625],[614,595],[736,249],[304,89],[91,12],[843,735],[901,816],[670,540],[460,327],[997,773],[957,180],[210,163],[812,407],[415,251],[957,156],[667,563],[498,336],[937,29],[197,133],[439,50],[878,475],[262,236],[413,339],[849,49],[668,81],[909,273],[321,93],[739,243],[965,338],[778,743],[999,711],[590,405],[773,623],[932,319],[621,502],[743,577],[589,311],[419,40],[786,307],[908,734],[276,230],[750,235],[520,203],[825,692],[248,120],[124,112],[867,739],[884,322],[156,126],[668,110],[578,226],[723,437],[716,504],[550,37],[792,352],[837,221],[572,260],[762,175],[869,822],[533,511],[604,122],[569,326],[983,974],[931,783],[858,503],[281,28],[918,402],[822,573],[715,68],[867,476],[428,84],[698,609],[802,400],[416,71],[618,314],[509,60],[590,0],[463,198],[422,396],[511,382],[379,310],[528,405],[852,847],[661,468],[925,406],[439,177],[747,66],[192,129],[921,375],[922,511],[916,651],[670,137],[901,372],[334,26],[907,357],[589,512],[746,118],[552,85],[592,145],[777,199],[224,87],[906,255],[460,445],[837,588],[292,164],[457,393],[689,116],[874,217],[773,372],[258,117],[639,601],[702,184],[874,541],[907,673],[866,378],[847,580],[768,390],[895,560],[658,548],[744,525],[836,333],[939,268],[90,33],[995,591],[457,438],[680,262],[308,122],[923,793],[740,97],[769,662],[880,677],[735,673],[410,67],[258,119],[902,28],[684,627],[688,252],[579,497],[851,496],[817,197],[350,108],[549,268],[826,775],[762,507],[994,732],[674,63],[895,214],[922,643],[563,346],[651,634],[526,423],[525,271],[903,165],[238,201],[334,6],[271,137],[546,221],[788,406],[871,436],[726,457],[929,68],[783,658],[859,635],[905,275],[322,54],[590,324],[319,297],[856,788],[540,395],[880,511],[989,742],[825,549],[307,146],[772,610],[217,77],[925,621],[425,293],[432,133],[782,369],[537,376],[688,451],[404,304],[676,107],[730,55],[879,75],[910,166],[669,169],[62,2],[119,16],[671,652],[683,448],[936,139],[762,694],[684,0],[585,403],[957,32],[568,9],[520,480],[905,879],[543,74],[741,596],[475,467],[389,215],[688,584],[830,184],[455,55],[340,168],[970,49],[970,678],[975,924],[948,654],[293,251],[431,254],[579,16],[862,126],[585,525],[999,123],[391,172],[407,142],[912,322],[527,151],[885,15],[767,189],[182,43],[668,41],[679,119],[469,449],[728,190],[307,238],[456,358],[476,314],[451,298],[957,253],[618,420],[636,158],[896,240],[745,500],[257,227],[930,703],[870,125],[968,907],[157,115],[851,133],[824,501],[569,42],[729,251],[348,345],[592,404],[96,88],[210,169],[764,302],[822,385],[439,136],[465,315],[97,26],[626,385],[981,496],[341,316],[803,84],[554,260],[795,181],[923,113],[482,28],[576,113],[731,498],[321,52],[668,172],[417,400],[710,157],[335,179],[575,219],[641,356],[346,18],[321,142],[829,382],[794,529],[964,352],[379,6],[965,282],[818,255],[432,287],[863,756],[419,71],[503,400],[919,25],[848,565],[324,248],[663,25],[377,345],[577,129],[948,141],[811,547],[799,6],[981,144],[302,166],[794,439],[144,104],[802,507],[840,13],[774,252],[789,236],[581,507],[925,894],[693,439],[411,120],[724,557],[736,403],[150,62],[612,278],[859,391],[839,475],[739,178],[930,412],[233,69],[611,112],[636,477],[304,303],[658,565],[318,180],[750,159],[834,172],[481,41],[828,295],[703,631],[834,793],[788,25],[912,391],[97,12],[819,319],[518,337],[118,58],[843,782],[131,93],[881,489],[408,113],[974,345],[960,236],[962,9],[995,691],[707,224],[676,180],[741,325],[915,126],[921,507],[945,856],[935,548],[705,255],[878,560],[865,374],[763,37],[987,538],[597,347],[717,335],[712,23],[981,145],[917,146],[935,928],[894,273],[625,520],[898,403],[511,305],[267,103],[687,607],[970,91],[542,540],[944,350],[917,745],[422,263],[883,239],[931,305],[398,74],[389,181],[272,128],[905,93],[835,83],[940,747],[823,101],[799,174],[54,38],[161,6],[759,747],[596,478],[630,59],[834,45],[951,743],[947,336],[76,70],[759,477],[595,211],[700,379],[685,459],[974,256],[667,449],[861,407],[699,430],[332,261],[559,311],[738,87],[772,541],[537,4],[999,26],[617,264],[922,163],[903,389],[277,174],[794,127],[942,832],[728,581],[925,903],[230,127],[462,89],[888,593],[798,649],[995,105],[511,118],[814,300],[488,227],[873,529],[327,154],[968,377],[664,471],[794,170],[652,299],[522,379],[238,207],[810,727],[551,393],[570,212],[697,671],[654,193],[805,380],[980,537],[871,266],[994,890],[907,131],[146,52],[920,48],[412,177],[765,459],[347,318],[957,438],[872,131],[511,92],[752,577],[760,582],[845,104],[942,857],[858,91],[927,79],[767,220],[779,493],[500,185],[349,229],[280,45],[544,245],[733,373],[722,636],[899,635],[501,128],[800,751],[847,149],[922,905],[970,226],[906,479],[673,584],[892,435],[454,178],[943,613],[846,330],[478,464],[499,150],[628,391],[847,49],[471,150],[185,168],[791,270],[975,462],[975,788],[762,627],[793,139],[179,46],[555,461],[700,22],[661,75],[656,18],[994,113],[886,584],[739,593],[820,390],[471,343],[973,334],[114,108],[498,212],[810,374],[774,87],[942,303],[510,442],[875,124],[985,481],[438,408],[633,66],[734,138],[474,176],[811,378],[342,324],[870,568],[534,211],[681,323],[670,141],[243,134],[336,199],[907,744],[935,654],[364,293],[474,365],[624,1],[865,328],[382,169],[865,802],[660,170],[835,422],[951,325],[323,262],[399,184],[695,321],[577,97],[717,520],[675,37],[234,178],[296,155],[751,215],[934,509],[957,840],[382,164],[346,300],[752,208],[366,128],[983,2],[768,730],[975,715],[193,108],[259,204],[603,243],[699,455],[179,142],[561,287],[485,5],[852,216],[464,314],[150,109],[677,572],[838,723],[961,469],[808,496],[867,668],[681,596],[933,60],[869,199],[956,10],[953,864],[833,218],[701,411],[859,813],[947,279],[574,362],[933,43],[869,737],[938,118],[997,375],[931,294],[970,334],[805,712],[89,47],[239,143],[409,165],[995,458],[510,450],[502,352],[637,31],[550,516],[610,567],[368,75],[632,459],[845,702],[614,388],[904,99],[726,306],[938,658],[443,99],[499,14],[459,288],[412,68],[947,932],[937,351],[591,421],[993,152],[901,868],[855,618],[630,322],[548,431],[480,366],[6,5],[905,55],[736,221],[825,319],[493,101],[863,760],[870,844],[818,154],[596,421],[958,843],[752,751],[604,206],[386,236],[394,182],[625,290],[607,199],[357,351],[767,260],[632,273],[466,17],[328,88],[360,68],[716,158],[551,56],[979,509],[991,29],[566,115],[445,245],[888,734],[857,539],[530,90],[834,343],[826,686],[357,86],[701,368],[480,246],[977,702],[394,29],[664,654],[594,465],[754,498],[324,257],[285,153],[997,674],[477,102],[929,653],[463,348],[431,43],[731,627],[967,365],[452,134],[333,186],[534,523],[868,514],[370,282],[663,12],[455,227],[797,655],[675,333],[740,187],[676,564],[379,374],[829,48],[940,253],[704,703],[829,669],[278,57],[991,112],[201,96],[383,178],[929,48],[870,425],[727,267],[413,213],[892,116],[883,363],[371,195],[726,34],[935,851],[785,363],[754,443],[834,62],[682,122],[545,148],[748,454],[756,125],[366,26],[683,59],[504,125],[384,153],[649,405],[905,396],[884,145],[524,109],[283,170],[429,12],[721,160],[903,350],[410,223],[241,199],[943,919],[828,418],[637,259],[803,24],[418,201],[686,19],[645,534],[339,291],[942,41],[592,408],[539,428],[525,194],[479,155],[802,451],[991,349],[999,559],[971,960],[689,79],[593,455],[360,49],[478,398],[834,570],[656,41],[812,414],[954,278],[964,138],[911,647],[847,779],[417,232],[88,87],[917,69],[232,125],[479,464],[498,361],[634,134],[580,75],[684,429],[737,132],[107,29],[935,441],[678,103],[167,99],[557,96],[966,849],[601,572],[526,378],[744,177],[890,380],[353,316],[702,98],[952,309],[283,121],[651,619],[982,814],[651,574],[220,1],[778,193],[676,104],[839,94],[164,75],[898,536],[559,453],[952,392],[914,578],[494,335],[887,803],[774,282],[288,72],[681,555],[473,21],[869,771],[754,730],[984,670],[977,111],[629,40],[639,239],[696,690],[783,768],[608,317],[387,264],[602,590],[664,657],[522,128],[535,151],[354,57],[998,526],[710,481],[827,108],[728,435],[554,547],[878,289],[362,70],[892,490],[774,86],[503,272],[626,108],[320,104],[980,80],[745,687],[835,416],[950,20],[570,6],[934,449],[290,3],[485,16],[748,384],[580,191],[759,244],[309,21],[567,213],[565,399],[646,65],[829,805],[445,254],[880,864],[786,701],[891,685],[761,260],[784,347],[891,191],[532,7],[757,293],[977,270],[641,568],[473,39],[825,60],[875,386],[863,644],[961,371],[936,457],[758,237],[622,312],[812,146],[935,726],[599,206],[414,246],[940,787],[563,202],[835,202],[454,31],[865,708],[751,454],[482,112],[787,365],[648,354],[928,656],[781,69],[475,399],[886,261],[660,654],[886,430],[983,295],[138,31],[944,223],[734,301],[901,257],[762,87],[916,54],[838,750],[570,72],[507,134],[217,109],[383,180],[841,219],[241,1],[920,316],[860,583],[929,259],[799,673],[69,54],[470,391],[828,28],[689,18],[839,654],[579,570],[833,785],[940,265],[192,181],[979,435],[933,525],[827,742],[440,132],[501,244],[802,477],[906,442],[171,70],[332,8],[684,287],[910,531],[825,518],[959,639],[952,614],[698,674],[913,508],[675,264],[204,11],[326,278],[424,155],[571,485],[348,263],[715,352],[832,584],[749,578],[888,254],[724,215],[720,154],[567,144],[794,0],[867,314],[708,224],[591,407],[798,725],[506,323],[341,323],[434,130],[949,288],[960,717],[904,441],[887,177],[667,333],[900,575],[832,258],[867,828],[566,280],[590,384],[693,348],[925,41],[514,250],[23,9],[708,449],[574,179],[794,644],[631,457],[789,692],[818,514],[394,35],[814,704],[816,106],[914,312],[847,125],[650,390],[294,30],[466,143],[831,544],[537,379],[707,489],[900,588],[540,488],[732,111],[899,332],[669,522],[963,44],[880,149],[857,40],[330,204],[939,867],[423,209],[524,491],[717,163],[773,20],[577,490],[365,239],[910,480],[838,461],[108,65],[931,344],[969,575],[843,76],[748,469],[609,340],[977,29],[642,513],[847,502],[449,23],[830,298],[731,34],[373,291],[958,498],[183,35],[383,9],[669,26],[947,805],[547,459],[858,476],[887,524],[554,410],[664,535],[630,358],[701,533],[982,123],[823,584],[943,847],[310,16],[984,91],[749,725],[831,24],[734,302],[700,97],[912,902],[65,50],[680,472],[781,611],[979,761],[251,115],[609,455],[335,61],[718,253],[821,482],[264,116],[468,369],[350,142],[822,598],[958,172],[692,509],[443,65],[853,437],[671,187],[919,564],[512,305],[526,364],[830,657],[201,39],[302,184],[924,56],[377,334],[586,439],[539,135],[961,714],[955,702],[867,330],[613,93],[604,71],[891,422],[911,558],[840,299],[880,442],[650,442],[470,383],[432,292],[926,576],[401,350],[464,397],[932,115],[836,474],[855,283],[656,252],[851,672],[588,186],[838,820],[511,329],[970,799],[312,3],[677,601],[106,70],[432,48],[639,151],[380,302],[674,197],[331,168],[438,381],[690,617],[625,560],[740,4],[573,55],[436,116],[327,106],[959,509],[527,484],[276,228],[915,560],[600,118],[852,57],[641,555],[953,884],[675,352],[738,272],[796,344],[884,232],[880,694],[384,56],[364,63],[338,15],[948,391],[860,357],[528,462],[440,272],[974,0],[383,144],[721,651],[899,646],[540,412],[996,212],[746,436],[752,512],[270,93],[757,9],[807,162],[85,18],[592,505],[834,460],[87,57],[675,570],[748,244],[819,65],[736,578],[352,185],[289,174],[893,777],[896,629],[822,323],[550,276],[625,321],[239,178],[453,153],[957,429],[464,21],[787,402],[969,235],[508,2],[647,626],[945,705],[579,387],[728,610],[619,589],[652,271],[923,785],[767,565],[871,667],[122,105],[920,812],[409,289],[980,822],[504,406],[467,189],[852,806],[814,321],[256,170],[946,654],[270,32],[393,51],[918,545],[949,185],[853,827],[873,175],[480,6],[768,229],[589,439],[975,661],[843,124],[681,398],[504,412],[242,66],[340,257],[946,383],[933,30],[910,275],[979,407],[878,818],[333,4],[567,455],[142,51],[988,74],[641,91],[808,202],[210,133],[790,108],[588,419],[659,223],[149,98],[637,372],[665,559],[539,42],[287,143],[158,133],[884,265],[319,282],[270,209],[719,385],[975,147],[411,84],[842,393],[491,206],[826,517],[919,909],[671,305],[234,77],[941,246],[977,75],[994,700],[116,35],[976,263],[910,344],[604,515],[578,399],[383,296],[374,218],[774,440],[844,721],[708,60],[636,34],[574,297],[626,492],[90,69],[500,203],[443,81],[660,397],[235,214],[776,279],[810,346],[966,26],[234,42],[407,373],[302,116],[52,9],[758,79],[870,581],[897,349],[552,548],[924,154],[259,29],[966,713],[720,160],[798,219],[942,867],[464,191],[606,466],[799,546],[443,122],[766,278],[929,762],[517,306],[953,566],[746,506],[842,205],[616,382],[745,87],[187,148],[814,494],[990,557],[452,119],[787,61],[849,23],[904,353],[703,319],[552,408],[603,110],[579,548],[770,340],[869,820],[370,304],[550,431],[563,300],[162,113],[790,314],[898,794],[450,401],[875,812],[947,542],[318,85],[901,648],[884,21],[951,345],[671,551],[297,222],[877,249],[845,548],[683,223],[739,529],[384,318],[718,328],[345,206],[573,77],[727,610],[842,763],[461,75],[772,327],[493,370],[824,693],[371,28],[482,305],[773,155],[384,249],[928,383],[875,34],[959,478],[900,196],[721,113],[777,221],[936,163],[940,874],[77,36],[467,461],[320,186],[747,284],[761,711],[576,357],[869,856],[769,607],[918,96],[827,90],[545,23],[475,182],[949,110],[635,208],[214,52],[508,14],[904,141],[162,90],[170,53],[564,346],[345,35],[796,400],[425,71],[211,98],[348,7],[642,626],[617,336],[825,599],[602,244],[998,122],[593,195],[966,169],[357,349],[843,322],[104,22],[821,104],[643,380],[647,208],[915,4],[665,477],[610,413],[785,492],[571,25],[823,586],[251,194],[686,274],[723,488],[521,386],[698,33],[400,279],[606,254],[430,393],[965,481],[506,105],[903,762],[518,265],[723,434],[798,743],[812,137],[979,249],[691,517],[947,126],[811,280],[933,146],[362,77],[658,560],[495,7],[500,58],[770,30],[956,836],[668,372],[557,103],[222,97],[902,614],[519,48],[570,439],[655,490],[708,687],[400,86],[731,620],[954,390],[441,366],[812,223],[443,352],[928,162],[634,306],[992,806],[784,37],[82,46],[525,430],[794,476],[365,46],[969,191],[371,151],[174,63],[993,602],[827,691],[738,427],[831,42],[979,593],[961,788],[598,141],[979,204],[114,54],[487,163],[717,298],[421,418],[167,30],[561,452],[630,374],[643,292],[534,311],[767,749],[343,242],[618,255],[877,442],[936,600],[738,420],[841,648],[658,610],[974,100],[947,146],[549,158],[680,630],[321,210],[436,26],[924,89],[800,605],[446,358],[892,865],[472,121],[925,499],[435,177],[820,284],[958,852],[262,111],[890,473],[942,384],[346,283],[956,817],[447,189],[455,137],[255,5],[866,851],[148,134],[725,381],[973,903],[817,711],[934,46],[971,371],[714,686],[780,505],[732,84],[441,227],[971,758],[907,395],[980,50],[810,741],[209,83],[314,212],[842,111],[570,326],[220,171],[233,184],[982,277],[94,74],[904,186],[374,196],[400,225],[959,121],[208,96],[998,477],[370,27],[454,336],[704,231],[825,27],[857,737],[942,381],[646,137],[666,506],[88,67],[618,226],[842,840],[842,528],[293,29],[662,580],[289,287],[499,252],[500,325],[899,754],[519,491],[489,126],[413,171],[916,57],[882,826],[792,3],[882,670],[838,633],[222,221],[673,299],[800,284],[418,163],[402,34],[626,118],[866,93],[871,421],[787,216],[952,295],[830,61],[446,341],[963,74],[941,655],[574,292],[163,147],[941,935],[957,254],[825,335],[874,647],[304,276],[732,562],[800,795],[212,94],[806,219],[893,312],[574,427],[957,98],[718,144],[673,643],[584,242],[624,309],[426,57],[936,676],[225,74],[851,440],[663,450],[541,449],[644,281],[929,564],[630,184],[914,468],[511,422],[566,33],[492,350],[813,506],[513,187],[898,832],[664,461],[803,449],[275,150],[954,812],[417,320],[919,271],[568,365],[778,511],[629,428],[780,119],[856,49],[842,601],[613,63],[996,589],[560,293],[85,25],[834,330],[617,255],[621,587],[664,115],[691,472],[327,3],[718,46],[995,377],[460,158],[799,708],[650,569],[324,216],[947,925],[975,621],[415,66],[615,240],[758,101],[727,38],[683,455],[733,289],[774,415],[677,22],[720,277],[419,7],[553,194],[545,2],[263,95],[606,482],[510,266],[235,173],[837,440],[698,579],[976,898],[610,129],[124,11],[460,236],[998,125],[808,45],[457,262],[796,205],[546,210],[807,328],[738,597],[571,542],[770,492],[688,391],[912,685],[955,131],[113,69],[849,451],[704,139],[780,699],[653,17],[722,588],[950,931],[768,448],[909,54],[611,251],[752,598],[272,90],[698,178],[864,750],[873,705],[988,122],[904,207],[835,677],[568,303],[992,5],[540,491],[326,159],[923,110],[943,888],[780,196],[509,315],[730,269],[459,377],[472,421],[689,57],[896,389],[852,708],[923,808],[506,85],[919,255],[929,70],[475,215],[692,481],[492,444],[439,435],[737,525],[865,215],[725,586],[747,421],[142,106],[982,623],[957,427],[835,20],[738,618],[729,345],[834,332],[720,633],[662,278],[854,497],[760,750],[923,920],[397,354],[522,457],[860,380],[519,481],[259,136],[823,691],[528,161],[395,0],[949,29],[415,358],[372,45],[759,203],[669,25],[967,507],[937,421],[925,64],[390,301],[710,497],[434,286],[791,380],[844,425],[873,239],[843,528],[949,497],[789,4],[911,778],[549,372],[698,677],[384,365],[918,104],[919,163],[532,443],[219,77],[410,124],[378,217],[972,825],[149,104],[608,13],[761,530],[440,312],[374,184],[472,316],[747,570],[672,460],[937,449],[382,368],[832,574],[701,448],[717,626],[452,451],[412,196],[634,102],[506,362],[245,84],[632,114],[933,366],[662,198],[686,619],[259,166],[451,215],[478,416],[892,742],[854,773],[45,1],[568,266],[983,179],[874,765],[542,18],[758,160],[920,516],[992,939],[986,48],[926,193],[761,15],[816,321],[659,143],[810,382],[613,132],[595,30],[787,731],[550,71],[400,335],[781,72],[290,194],[918,898],[646,363],[508,338],[390,341],[914,875],[368,13],[569,14],[639,256],[667,204],[733,215],[554,179],[390,326],[566,314],[964,829],[449,253],[819,376],[367,125],[501,145],[708,650],[958,230],[774,661],[514,343],[369,289],[886,139],[936,702],[963,59],[538,107],[376,24],[350,117],[997,994],[810,805],[620,16],[411,154],[866,399],[753,607],[781,276],[371,172],[633,436],[999,675],[765,88],[316,8],[593,191],[845,518],[850,105],[873,211],[977,3],[577,232],[826,497],[907,146],[202,23],[540,229],[980,649],[900,579],[742,393],[336,202],[400,175],[314,13],[790,42],[306,52],[907,566],[352,18],[648,139],[978,695],[779,709],[314,70],[849,477],[791,415],[884,727],[415,383],[391,292],[608,28],[498,320],[372,94],[988,813],[631,303],[949,636],[888,229],[416,87],[694,440],[610,497],[724,512],[108,52],[831,715],[479,350],[337,171],[997,215],[963,327],[685,336],[964,124],[993,668],[824,296],[914,758],[545,39],[388,106],[950,541],[837,715],[622,484],[809,656],[993,474],[634,3],[846,656],[582,517],[999,160],[447,199],[654,354],[400,203],[714,659],[933,844],[943,34],[143,72],[832,345],[835,457],[518,215],[819,668],[267,226],[346,262],[431,356],[384,2],[200,16],[974,758],[304,110],[290,125],[677,146],[751,651],[955,685],[691,348],[576,183],[816,385],[608,481],[877,578],[502,369],[323,219],[537,511],[646,355],[356,92],[279,142],[743,39],[888,550],[850,384],[291,116],[484,284],[715,577],[548,538],[680,628],[839,439],[576,118],[765,553],[543,435],[818,788],[923,201],[453,164],[781,179],[299,137],[835,301],[660,242],[677,312],[691,188],[594,52],[759,374],[583,78],[792,647],[621,236],[388,171],[165,152],[846,750],[909,247],[493,436],[274,236],[904,231],[503,58],[961,724],[967,642],[623,129],[806,568],[723,511],[994,22],[824,467],[767,205],[488,343],[605,548],[837,48],[948,590],[758,217],[267,176],[638,153],[997,807],[588,123],[585,473],[877,607],[543,71],[890,544],[660,6],[846,675],[797,35],[563,76],[346,207],[888,214],[758,174],[775,346],[954,831],[754,53],[477,193],[999,61],[295,155],[727,9],[986,979],[928,266],[294,262],[781,644],[981,902],[392,378],[936,744],[264,153],[888,500],[476,62],[921,91],[662,625],[359,350],[588,139],[612,549],[940,37],[899,21],[968,840],[813,513],[488,46],[776,144],[387,148],[926,144],[774,82],[603,156],[788,479],[182,98],[825,199],[723,252],[291,280],[172,120],[604,408],[554,528],[895,463],[904,356],[898,203],[394,31],[647,146],[249,36],[433,430],[476,14],[353,211],[959,380],[332,277],[767,555],[958,121],[960,365],[998,555],[683,52],[983,837],[742,114],[899,695],[307,10],[948,802],[753,8],[921,529],[484,114],[67,54],[942,884],[429,321],[219,116],[868,769],[346,110],[600,155],[859,662],[725,534],[919,376],[292,262],[523,84],[532,289],[932,806],[734,730],[939,617],[590,523],[753,386],[732,223],[358,164],[477,288],[993,326],[876,713],[744,693],[886,23],[846,344],[789,298],[596,488],[692,484],[233,133],[513,224],[582,486],[468,426],[928,153],[551,451],[231,224],[715,31],[387,378],[613,358],[547,134],[696,29],[955,286],[984,200],[644,244],[533,3],[467,40],[641,496],[227,135],[744,332],[627,86],[987,867],[955,472],[944,14],[979,354],[231,152],[190,41],[793,731],[609,50],[168,85],[507,481],[695,423],[766,379],[139,79],[948,611],[822,150],[885,360],[888,706],[933,830],[383,311],[974,321],[528,218],[573,236],[962,521],[112,89],[732,140],[238,118],[605,205],[725,697],[989,331],[536,261],[349,35],[548,79],[855,248],[517,325],[637,235],[919,510],[637,170],[644,86],[600,347],[941,768],[636,85],[497,252],[766,326],[842,589],[908,401],[871,397],[689,194],[770,462],[459,339],[367,230],[773,374],[701,252],[910,283],[257,199],[947,748],[623,371],[364,218],[818,184],[769,695],[946,328],[722,515],[883,100],[985,441],[887,410],[315,310],[606,213],[703,376],[932,108],[877,583],[575,489],[677,132],[459,194],[774,357],[744,599],[898,543],[940,924],[915,230],[980,793],[776,649],[756,28],[613,258],[763,171],[650,221],[646,185],[776,240],[375,160],[976,237],[200,39],[845,477],[947,404],[787,32],[957,742],[310,57],[944,8],[747,458],[888,258],[995,897],[845,626],[891,384],[632,319],[854,384],[429,182],[661,356],[920,881],[947,39],[826,44],[171,138],[177,159],[603,329],[845,14],[327,324],[431,142],[802,725],[776,151],[519,140],[824,66],[246,159],[378,207],[694,419],[957,409],[237,178],[914,291],[542,312],[769,61],[632,537],[969,843],[848,134],[820,718],[484,138],[440,20],[926,19],[894,765],[841,52],[697,419],[524,473],[357,54],[987,910],[728,134],[875,370],[450,423],[578,565],[388,232],[772,577],[291,222],[382,29],[893,289],[575,147],[480,60],[926,178],[633,149],[875,207],[814,13],[757,270],[193,162],[683,401],[386,345],[145,78],[449,87],[563,176],[911,348],[964,468],[951,280],[807,613],[680,114],[747,165],[553,285],[912,313],[887,541],[719,542],[730,56],[544,525],[372,275],[939,326],[707,229],[922,261],[676,284],[600,337],[173,15],[371,248],[761,448],[650,341],[385,336],[836,63],[450,23],[924,296],[546,75],[90,63],[918,452],[957,607],[936,230],[892,666],[640,57],[797,593],[824,264],[866,354],[830,737],[600,593],[297,217],[988,620],[791,642],[998,545],[341,176],[978,159],[724,283],[870,460],[695,576],[923,341],[954,263],[288,47],[665,589],[795,20],[917,660],[453,436],[492,47],[819,191],[687,315],[390,37],[257,237],[335,50],[587,503],[270,212],[199,148],[878,706],[691,405],[785,327],[883,202],[875,136],[979,793],[875,563],[607,120],[482,269],[994,257],[546,182],[858,16],[435,412],[544,456],[727,616],[724,149],[906,654],[958,635],[408,184],[637,41],[995,930],[610,219],[742,529],[959,376],[197,176],[156,5],[660,268],[149,146],[920,416],[867,864],[885,506],[857,24],[934,723],[796,420],[689,92],[779,285],[473,251],[607,70],[907,638],[840,799],[424,57],[921,240],[708,458],[714,655],[458,114],[812,745],[535,265],[856,97],[616,420],[462,186],[321,168],[828,390],[864,855],[829,788],[496,66],[968,913],[757,308],[521,514],[595,48],[291,23],[793,791],[399,143],[391,276],[899,431],[576,397],[703,678],[893,89],[595,536],[676,534],[387,239],[372,67],[291,185],[667,666],[732,129],[151,16],[929,820],[499,311],[715,565],[933,385],[926,37],[573,563],[638,446],[988,680],[648,459],[802,579],[411,158],[445,46],[134,6],[923,675],[964,163],[736,596],[608,335],[227,148],[752,619],[234,149],[218,70],[801,19],[644,390],[105,17],[722,135],[433,158],[221,7],[970,93],[236,124],[898,572],[314,190],[777,138],[940,664],[836,759],[860,501],[819,136],[834,754],[791,602],[751,520],[976,188],[501,454],[631,201],[951,56],[788,53],[936,722],[403,241],[837,644],[907,305],[979,122],[437,334],[816,390],[664,536],[723,510],[214,16],[493,23],[584,281],[717,153],[661,86],[823,12],[782,415],[529,378],[789,163],[611,204],[852,201],[931,845],[741,70],[491,18],[825,669],[842,804],[199,119],[376,254],[666,91],[503,153],[729,17],[277,148],[965,466],[890,298],[882,742],[927,345],[826,632],[762,276],[211,167],[445,225],[661,441],[498,173],[838,804],[711,467],[625,494],[884,684],[698,643],[928,307],[499,342],[720,303],[646,309],[860,588],[364,5],[349,155],[970,855],[787,585],[846,616],[811,405],[675,665],[937,621],[189,93],[367,73],[970,936],[440,25],[831,468],[261,80],[496,423],[744,184],[868,524],[843,586],[940,856],[983,329],[503,385],[751,638],[159,134],[326,100],[941,40],[989,494],[732,207],[215,192],[817,597],[727,161],[888,111],[389,117],[735,651],[176,48],[465,98],[248,105],[672,562],[695,397],[660,611],[946,933],[541,239],[429,25],[465,385],[247,46],[892,406],[251,231],[340,224],[915,410],[762,739],[486,43],[644,98],[619,27],[915,352],[491,193],[247,18],[647,161],[608,89],[337,21],[875,431],[772,94],[888,70],[859,203],[687,556],[672,420],[814,666],[484,337],[878,661],[995,172],[566,174],[379,247],[639,173],[609,208],[208,177],[963,394],[711,407],[338,215],[353,77],[540,328],[942,537],[694,327],[975,879],[926,128],[537,55],[563,273],[876,674],[406,46],[846,287],[990,629],[916,811],[752,312],[371,34],[789,184],[994,532],[571,94],[626,355],[219,11],[759,569],[357,39],[809,615],[422,262],[982,173],[558,145],[866,687],[720,604],[614,96],[833,501],[666,143],[697,606],[244,165],[809,114],[677,376],[834,310],[766,696],[962,271],[175,132],[557,548],[426,217],[535,72],[374,342],[741,451],[908,852],[808,54],[578,520],[364,50],[224,127],[486,359],[975,132],[935,642],[994,250],[801,727],[461,329],[663,614],[742,618],[916,720],[590,240],[246,36],[425,242],[656,171],[980,929],[941,641],[594,112],[874,224],[204,195],[876,134],[701,21],[217,128],[690,417],[569,38],[941,490],[772,13],[268,44],[195,160],[581,216],[676,85],[736,686],[886,731],[285,54],[435,292],[987,827],[721,522],[577,70],[877,289],[773,105],[488,0],[455,41],[974,871],[955,791],[566,73],[415,404],[317,19],[954,882],[802,309],[695,542],[467,261],[513,133],[662,374],[128,111],[468,364],[828,100],[677,322],[646,391],[753,302],[836,69],[797,96],[281,110],[489,184],[728,425],[969,37],[483,14],[863,761],[673,36],[904,149],[669,556],[193,173],[824,565],[934,477],[297,269],[861,779],[491,133],[525,166],[828,81],[894,10],[180,152],[560,472],[782,131],[105,42],[945,850],[974,59],[315,150],[594,102],[540,480],[985,258],[998,798],[955,634],[457,126],[848,435],[600,113],[146,73],[801,208],[909,278],[451,250],[312,134],[602,574],[915,754],[531,205],[732,702],[665,324],[553,424],[698,82],[748,106],[816,150],[672,475],[196,182],[856,785],[898,630],[741,632],[524,86],[480,206],[829,597],[756,177],[777,364],[655,43],[428,293],[503,274],[313,26],[389,191],[709,141],[835,382],[673,196],[611,216],[667,167],[544,115],[409,354],[677,109],[443,32],[602,217],[926,889],[531,67],[702,122],[629,562],[618,296],[886,391],[358,160],[922,383],[710,1],[456,264],[818,683],[264,62],[726,296],[714,410],[461,243],[947,716],[254,219],[725,248],[126,0],[964,183],[502,203],[461,389],[472,4],[304,291],[984,213],[652,202],[957,210],[456,43],[547,443],[475,246],[559,47],[566,544],[860,447],[702,538],[967,299],[933,155],[632,92],[227,188],[704,67],[387,185],[759,181],[670,150],[216,22],[778,442],[619,296],[845,207],[878,792],[915,871],[941,555],[900,292],[463,212],[923,914],[91,16],[739,682],[815,542],[755,322],[320,14],[763,464],[702,112],[464,375],[752,704],[316,111],[628,497],[676,246],[658,96],[967,923],[530,26],[270,264],[386,127],[477,372],[620,253],[750,340],[518,174],[565,436],[648,8],[261,239],[367,341],[336,50],[114,78],[491,282],[660,417],[733,498],[996,258],[973,683],[829,682],[434,46],[321,77],[835,42],[332,242],[366,345],[898,350],[871,482],[441,104],[781,195],[638,513],[691,635],[298,245],[448,362],[140,82],[335,329],[495,74],[319,205],[598,567],[500,439],[439,144],[515,60],[412,36],[992,279],[715,524],[959,549],[978,888],[342,246],[673,399],[702,157],[689,74],[748,486],[985,673],[303,233],[647,430],[556,290],[553,324],[913,768],[952,744],[605,336],[740,709],[860,767],[195,9],[696,481],[447,16],[705,292],[841,550],[863,178],[970,209],[765,148],[228,14],[977,661],[423,21],[495,384],[451,41],[799,396],[771,745],[123,96],[911,316],[821,213],[721,348],[644,529],[724,569],[774,652],[702,249],[401,124],[553,525],[626,92],[21,0],[119,91],[993,276],[361,305],[406,283],[428,331],[966,205],[342,95],[769,517],[867,183],[949,6],[828,25],[822,470],[863,809],[895,305],[815,432],[599,33],[856,239],[524,356],[773,383],[515,223],[401,108],[602,595],[96,73],[661,610],[922,124],[655,350],[650,438],[310,50],[527,380],[699,239],[571,108],[777,102],[507,313],[969,947],[876,102],[723,665],[882,529],[545,320],[697,192],[451,296],[754,362],[242,167],[743,642],[878,767],[497,46],[441,139],[428,29],[634,238],[493,245],[675,437],[985,850],[415,31],[437,296],[434,223],[909,348],[739,72],[975,766],[895,279],[495,114],[970,122],[649,207],[556,415],[570,529],[871,153],[395,191],[600,489],[724,447],[948,656],[925,758],[787,643],[845,292],[200,74],[597,11],[825,591],[774,326],[884,822],[488,91],[787,17],[930,908],[364,150],[456,103],[860,642],[965,487],[976,968],[576,333],[548,311],[590,158],[488,459],[588,469],[729,276],[992,181],[514,454],[885,32],[361,350],[640,531],[233,46],[715,138],[963,260],[928,735],[546,337],[403,11],[379,30],[894,110],[331,203],[942,155],[782,301],[815,526],[593,301],[760,348],[601,213],[968,122],[610,417],[940,405],[859,57],[594,574],[305,176],[429,254],[364,12],[231,55],[721,540],[917,796],[397,392],[670,177],[502,160],[605,568],[537,302],[717,625],[997,893],[739,108],[681,491],[897,498],[915,328],[679,288],[746,11],[808,505],[550,482],[690,145],[234,197],[435,259],[116,59],[629,186],[213,206],[792,382],[320,116],[649,400],[326,267],[722,136],[92,69],[983,898],[794,133],[950,834],[170,0],[847,322],[849,392],[840,202],[210,80],[731,565],[753,145],[809,334],[814,796],[148,23],[561,96],[837,132],[520,306],[943,276],[615,303],[830,140],[884,355],[485,61],[344,141],[259,132],[957,908],[710,315],[233,226],[275,261],[994,502],[759,240],[847,645],[666,80],[722,711],[639,579],[669,69],[907,263],[329,36],[773,183],[617,149],[598,149],[975,346],[847,672],[874,132],[970,236],[578,309],[64,7],[968,275],[963,556],[847,234],[830,111],[482,257],[358,299],[975,509],[587,100],[476,412],[941,701],[296,227],[638,378],[395,371],[789,257],[624,420],[733,345],[810,709],[599,113],[855,759],[945,508],[913,528],[923,89],[948,111],[946,848],[496,257],[868,608],[898,126],[920,330],[694,96],[970,662],[923,831],[516,178],[218,186],[820,785],[990,444],[816,222],[705,111],[522,385],[909,446],[421,68],[910,168],[714,12],[981,749],[532,470],[563,118],[367,107],[248,238],[958,418],[530,441],[576,401],[495,380],[766,198],[740,392],[879,606],[817,787],[861,857],[941,230],[943,464],[856,740],[591,94],[406,371],[672,127],[751,650],[559,235],[620,417],[676,596],[560,350],[841,328],[941,602],[589,45],[664,595],[515,479],[645,82],[161,18],[945,503],[873,461],[319,47],[943,642],[855,564],[337,246],[851,688],[854,185],[498,113],[509,68],[351,282],[922,863],[858,601],[951,700],[550,345],[380,154],[904,290],[533,139],[825,659],[918,647],[916,607],[685,358],[946,757],[829,763],[622,398],[393,5],[952,814],[136,47],[649,407],[751,294],[844,24],[793,501],[304,240],[912,246],[834,516],[355,273],[980,700],[883,690],[181,156],[790,76],[486,333],[703,471],[255,37],[963,700],[461,64],[142,26],[950,13],[425,363],[687,126],[821,72],[843,463],[571,168],[807,80],[506,353],[874,271],[258,230],[438,73],[951,832],[877,716],[317,79],[668,319],[816,102],[550,52],[517,55],[904,222],[316,168],[879,190],[574,431],[616,199],[946,115],[942,361],[585,387],[684,196],[686,680],[480,235],[615,375],[818,412],[229,163],[922,731],[379,70],[975,699],[800,627],[843,808],[753,748],[815,218],[673,44],[973,574],[821,112],[773,745],[758,593],[812,164],[640,53],[811,91],[969,766],[915,804],[802,519],[780,553],[998,979],[944,733],[961,267],[466,312],[209,55],[654,3],[502,115],[762,658],[745,574],[851,385],[174,70],[731,707],[864,146],[193,171],[719,613],[336,242],[402,52],[869,419],[958,836],[661,132],[740,502],[932,756],[627,351],[742,450],[910,128],[458,280],[530,411],[256,51],[909,750],[968,125],[626,606],[566,521],[900,782],[547,81],[647,144],[653,477],[620,245],[690,166],[758,462],[985,317],[297,97],[985,106],[627,286],[811,205],[715,455],[599,506],[729,289],[452,403],[872,189],[922,708],[936,498],[813,592],[954,165],[722,13],[974,751],[561,54],[518,38],[941,866],[821,14],[820,793],[787,184],[780,92],[336,40],[554,461],[847,114],[165,2],[453,267],[832,352],[759,274],[864,274],[246,8],[43,1],[823,278],[834,680],[557,217],[845,585],[724,381],[723,87],[852,241],[700,267],[666,577],[312,162],[843,724],[342,337],[908,90],[573,183],[733,214],[572,204],[880,633],[797,185],[827,440],[247,2],[630,441],[850,172],[904,699],[560,504],[678,615],[383,265],[459,137],[686,226],[885,289],[894,429],[678,541],[992,788],[646,239],[764,252],[638,168],[627,241],[836,379],[654,134],[179,38],[315,39],[624,610],[800,416],[328,57],[687,671],[943,47],[592,176],[737,540],[325,202],[820,142],[764,732],[858,435],[808,111],[780,545],[674,295],[933,747],[94,78],[924,323],[317,18],[454,340],[784,732],[843,437],[940,509],[926,472],[635,11],[607,84],[120,44],[948,173],[537,319],[808,504],[769,500],[448,17],[549,174],[530,9],[721,334],[291,246],[621,393],[825,5],[867,179],[755,92],[954,237],[697,476],[927,331],[141,33],[917,347],[889,747],[483,388],[799,495],[407,279],[480,42],[896,396],[826,757],[963,929],[385,200],[685,669],[946,192],[721,548],[883,808],[546,418],[982,561],[670,447],[898,654],[535,90],[199,60],[964,940],[608,207],[576,170],[977,471],[692,519],[789,597],[407,63],[870,762],[630,534],[852,404],[174,79],[961,378],[687,580],[276,44],[708,250],[817,312],[198,93],[785,696],[805,445],[573,305],[721,44],[813,617],[981,732],[859,273],[908,70],[935,786],[268,66],[968,406],[243,197],[284,255],[686,121],[961,570],[678,609],[416,13],[438,396],[849,76],[760,450],[710,457],[954,12],[708,245],[122,106],[562,166],[953,801],[511,449],[829,255],[934,67],[704,98],[854,400],[122,86],[755,288],[544,370],[900,542],[687,277],[672,273],[617,226],[365,334],[997,197],[647,202],[861,490],[274,168],[642,139],[692,289],[629,581],[703,440],[690,220],[823,87],[812,98],[519,58],[696,509],[417,227],[903,137],[641,194],[577,42],[858,152],[817,682],[695,472],[130,70],[898,45],[725,171],[465,154],[148,42],[751,583],[743,107],[847,315],[992,758],[273,182],[576,534],[331,124],[437,362],[960,829],[318,14],[386,83],[619,253],[828,154],[823,818],[940,801],[553,495],[884,390],[955,381],[273,60],[732,312],[804,68],[990,83],[763,235],[215,35],[986,621],[986,929],[985,917],[957,451],[621,484],[453,351],[482,36],[409,358],[262,45],[653,204],[552,356],[345,127],[342,63],[608,493],[776,452],[575,368],[305,75],[462,276],[271,96],[110,35],[615,259],[721,191],[642,75],[514,143],[749,49],[959,952],[961,770],[959,93],[594,54],[661,474],[579,467],[877,301],[748,320],[573,298],[612,170],[480,166],[977,398],[881,319],[835,165],[692,346],[485,174],[697,62],[172,161],[671,563],[892,312],[752,520],[720,281],[905,383],[340,217],[434,329],[979,485],[824,582],[713,394],[859,794],[805,7],[723,77],[536,153],[447,151],[704,698],[986,892],[798,268],[520,78],[846,32],[413,347],[714,271],[748,590],[239,204],[933,846],[644,74],[913,517],[202,166],[982,642],[934,811],[688,523],[287,185],[840,80],[801,415],[855,578],[926,521],[838,684],[912,583],[419,286],[555,216],[434,100],[414,310],[913,183],[968,619],[85,72],[540,382],[537,16],[755,693],[805,50],[45,28],[339,259],[459,67],[844,578],[707,665],[834,250],[264,261],[376,360],[364,95],[826,518],[437,169],[334,243],[542,210],[798,432],[452,90],[264,161],[707,527],[897,613],[948,528],[879,534],[648,364],[850,827],[151,50],[398,261],[688,284],[327,136],[290,33],[344,47],[464,259],[648,448],[905,280],[141,112],[701,59],[850,794],[691,626],[579,104],[194,80],[829,13],[424,288],[559,467],[865,578],[839,524],[923,190],[722,66],[304,294],[72,68],[905,478],[458,337],[987,124],[970,336],[551,264],[554,300],[646,531],[457,348],[472,194],[396,321],[868,373],[656,349],[796,316],[840,773],[750,704],[874,825],[605,220],[727,586],[608,271],[848,840],[265,197],[548,463],[841,14],[588,95],[874,159],[836,381],[685,456],[810,504],[742,612],[864,227],[888,675],[690,598],[761,352],[618,609],[761,544],[552,17],[102,77],[884,798],[297,266],[467,227],[847,541],[542,120],[644,572],[392,274],[327,262],[405,289],[715,585],[438,109],[403,253],[934,124],[921,494],[889,157],[627,78],[508,442],[121,82],[604,424],[925,9],[756,5],[903,322],[610,401],[646,99],[912,558],[258,220],[914,901],[761,398],[980,513],[933,41],[736,640],[875,57],[893,287],[814,152],[498,81],[971,7],[859,205],[903,438],[891,502],[653,573],[665,463],[727,720],[781,104],[499,122],[910,211],[910,697],[869,62],[615,553],[713,142],[825,456],[960,137],[346,132],[758,461],[911,341],[662,177],[620,569],[304,63],[453,194],[965,90],[833,731],[306,53],[905,544],[552,261],[660,291],[763,25],[667,343],[877,120],[923,267],[642,539],[929,542],[707,471],[966,564],[983,51],[647,47],[896,324],[665,85],[560,157],[560,439],[892,419],[442,141],[871,165],[826,99],[802,614],[705,414],[244,122],[751,640],[823,702],[731,502],[829,30],[590,247],[460,102],[378,175],[920,919],[503,29],[227,125],[389,258],[981,89],[776,568],[938,638],[753,462],[860,754],[864,81],[115,73],[731,689],[438,267],[983,867],[212,102],[855,40],[959,800],[920,303],[451,290],[664,146],[453,124],[997,813],[439,412],[410,340],[518,210],[988,958],[508,226],[831,482],[920,408],[832,537],[971,128],[752,627],[621,139],[731,543],[989,252],[802,433],[700,537],[735,393],[705,199],[883,859],[76,28],[519,53],[581,70],[796,681],[841,332],[287,153],[849,133],[193,112],[116,53],[746,220],[859,840],[873,861],[535,308],[580,219],[182,142],[792,434],[961,202],[440,210],[728,676],[753,95],[722,361],[914,350],[399,284],[569,112],[563,367],[534,40],[464,98],[914,46],[848,485],[780,275],[876,279],[928,18],[463,259],[780,437],[778,89],[684,654],[227,5],[363,184],[352,206],[572,270],[939,665],[817,544],[966,866],[572,145],[783,227],[896,355],[711,149],[815,26],[480,10],[723,658],[616,72],[799,381],[738,434],[882,92],[959,131],[556,446],[399,314],[796,673],[701,210],[840,344],[852,674],[870,656],[674,5],[681,663],[457,310],[624,4],[201,41],[874,315],[742,623],[716,648],[853,164],[857,555],[852,581],[279,188],[862,63],[631,611],[759,119],[900,289],[720,524],[935,484],[768,627],[453,213],[692,517],[629,143],[875,81],[246,221],[532,114],[310,170],[702,182],[899,442],[414,300],[962,153],[958,287],[495,332],[423,83],[746,432],[871,590],[295,149],[972,528],[666,68],[453,94],[877,685],[977,496],[672,523],[870,682],[817,531],[949,491],[502,356],[938,321],[621,76],[167,54],[705,519],[380,275],[967,950],[954,63],[306,237],[582,48],[759,576],[995,175],[694,193],[907,860],[237,9],[810,15],[932,706],[733,526],[915,878],[966,612],[448,34],[792,300],[398,137],[931,448],[889,44],[798,477],[913,485],[698,499],[616,411],[630,272],[434,413],[932,309],[698,16],[887,232],[685,438],[529,362],[789,191],[938,394],[675,235],[669,316],[623,256],[669,68],[639,99],[905,761],[449,405],[146,118],[187,152],[804,650],[827,198],[911,389],[884,75],[850,452],[886,440],[156,134],[596,338],[613,551],[946,54],[404,41],[494,230],[905,473],[706,680],[822,736],[135,34],[933,539],[475,269],[687,386],[697,627],[295,167],[397,151],[990,819],[925,136],[757,360],[140,107],[576,196],[915,448],[794,574],[754,636],[415,228],[757,327],[498,474],[357,157],[258,239],[633,382],[269,218],[412,336],[810,286],[904,569],[537,341],[869,402],[302,232],[587,167],[825,87],[753,340],[627,497],[878,47],[756,573],[479,367],[516,16],[828,64],[723,661],[928,43],[858,95],[929,332],[397,84],[755,66],[749,690],[841,781],[447,59],[912,94],[769,522],[926,831],[819,713],[883,294],[680,490],[257,15],[769,752],[906,832],[306,41],[752,127],[825,587],[670,62],[990,362],[814,429],[727,490],[169,66],[961,884],[494,160],[373,102],[499,3],[540,7],[261,152],[775,146],[918,9],[855,789],[339,309],[945,56],[964,301],[470,340],[997,858],[713,635],[610,596],[823,134],[731,639],[944,807],[557,414],[995,56],[745,299],[619,480],[648,101],[944,15],[768,670],[873,361],[907,545],[770,752],[47,37],[760,239],[758,156],[131,11],[822,758],[195,152],[379,334],[406,373],[414,201],[465,39],[650,482],[723,313],[891,107],[781,514],[789,556],[590,289],[936,729],[178,5],[587,274],[326,260],[522,228],[402,192],[583,577],[844,667],[525,229],[155,14],[912,780],[911,205],[776,119],[590,136],[998,312],[490,365],[993,240],[226,76],[673,128],[931,303],[994,667],[744,414],[677,439],[566,560],[831,153],[354,190],[633,296],[980,57],[948,904],[928,717],[157,91],[984,617],[229,221],[407,205],[941,656],[325,1],[589,575],[897,186],[748,260],[669,113],[827,395],[402,200],[876,314],[663,296],[872,424],[885,795],[871,373],[870,241],[768,695],[891,830],[943,302],[294,34],[765,453],[255,71],[970,909],[852,305],[709,26],[735,604],[592,308],[876,477],[293,140],[248,93],[962,656],[851,360],[785,194],[988,420],[889,663],[595,17],[568,449],[653,404],[872,726],[487,74],[423,211],[485,179],[976,926],[903,787],[652,307],[840,623],[182,88],[853,767],[661,105],[315,93],[525,412],[991,899],[959,589],[678,118],[765,239],[329,279],[932,415],[737,419],[601,556],[711,369],[780,321],[550,72],[936,262],[835,99],[664,464],[319,127],[604,379],[234,89],[608,176],[716,498],[284,112],[777,192],[667,255],[704,62],[455,393],[868,538],[781,575],[854,131],[543,265],[966,476],[842,134],[181,7],[63,1],[874,80],[944,918],[631,316],[768,674],[489,368],[346,112],[885,499],[807,95],[914,847],[704,701],[806,692],[566,453],[523,129],[507,460],[510,274],[588,154],[777,510],[404,233],[711,468],[911,166],[798,491],[682,538],[891,380],[573,384],[571,413],[908,79],[767,344],[499,479],[460,374],[760,360],[77,32],[394,144],[565,190],[476,392],[967,946],[759,341],[959,378],[220,210],[732,133],[256,29],[392,182],[146,23],[761,651],[914,899],[743,585],[781,160],[96,66],[684,618],[804,610],[769,17],[494,446],[948,844],[622,545],[962,507],[922,94],[806,87],[873,220],[832,732],[817,115],[671,430],[373,267],[189,162],[899,744],[894,892],[792,310],[566,120],[550,160],[938,274],[967,800],[951,706],[715,147],[647,91],[972,388],[622,54],[784,393],[837,16],[526,507],[851,658],[924,559],[459,119],[865,776],[271,189],[317,190],[795,42],[757,691],[793,762],[957,784],[996,171],[934,755],[248,99],[692,241],[376,90],[930,901],[771,568],[976,493],[625,562],[737,35],[968,295],[274,152],[188,16],[918,838],[989,176],[419,51],[980,551],[931,741],[897,234],[724,262],[899,773],[656,329],[448,373],[971,186],[521,145],[913,189],[988,462],[875,350],[517,125],[167,43],[773,499],[834,661],[903,559],[614,141],[533,152],[714,487],[485,285],[972,111],[970,408],[849,689],[753,443],[374,353],[312,105],[854,474],[604,119],[223,59],[718,386],[982,866],[859,347],[549,401],[597,250],[817,637],[997,800],[977,736],[457,111],[925,118],[574,326],[978,486],[899,681],[858,193],[924,93],[805,245],[814,501],[719,297],[636,352],[711,143],[190,143],[771,36],[902,286],[197,111],[956,223],[865,845],[467,330],[737,55],[925,683],[358,114],[913,131],[882,445],[963,244],[284,256],[452,166],[601,591],[968,183],[872,654],[923,562],[881,694],[651,225],[957,174],[623,590],[759,323],[733,262],[734,311],[399,58],[381,150],[867,857],[472,419],[862,70],[229,0],[268,69],[605,42],[304,166],[820,641],[878,164],[333,299],[559,52],[666,328],[969,424],[521,348],[630,301],[947,508],[959,937],[544,94],[625,387],[732,684],[212,9],[886,593],[802,2],[840,421],[671,369],[776,756],[850,295],[355,349],[476,213],[615,128],[954,884],[560,308],[874,297],[770,369],[788,35],[853,628],[745,394],[624,512],[632,2],[676,437],[489,168],[861,25],[928,93],[499,422],[335,154],[946,600],[401,344],[963,716],[442,45],[627,109],[817,781],[984,6],[525,67],[892,496],[932,132],[342,250],[671,325],[363,102],[532,191],[353,288],[927,785],[933,251],[591,516],[430,279],[874,815],[491,211],[709,227],[746,344],[627,549],[790,534],[791,395],[861,660],[627,408],[928,335],[554,267],[839,157],[571,284],[556,475],[743,242],[765,401],[316,220],[595,146],[178,168],[977,399],[953,297],[353,120],[938,703],[589,218],[835,641],[864,306],[614,430],[510,281],[593,459],[676,389],[428,30],[476,107],[924,330],[833,830],[528,371],[740,361],[689,170],[915,732],[480,67],[794,195],[961,942],[692,664],[354,300],[808,520],[170,73],[664,517],[424,0],[844,647],[438,207],[869,496],[698,139],[992,674],[556,110],[949,236],[777,410],[306,272],[841,272],[854,262],[688,464],[872,526],[928,903],[530,334],[932,666],[796,141],[738,2],[823,221],[943,534],[572,310],[884,551],[460,319],[964,777],[462,30],[559,132],[343,228],[828,27],[485,74],[419,354],[969,600],[603,445],[591,570],[274,138],[721,374],[773,758],[479,460],[779,768],[676,164],[385,166],[337,170],[998,71],[700,556],[499,52],[618,137],[715,373],[767,719],[896,452],[469,124],[738,49],[900,885],[565,388],[727,620],[838,807],[708,140],[562,262],[623,486],[584,136],[643,392],[449,287],[581,336],[758,559],[639,529],[911,186],[427,396],[363,171],[840,533],[591,213],[26,14],[804,222],[977,783],[345,169],[183,146],[156,51],[682,333],[941,862],[255,194],[871,63],[686,641],[987,391],[393,67],[592,566],[832,786],[502,283],[952,503],[636,603],[635,318],[200,168],[609,106],[680,63],[766,513],[304,109],[891,491],[411,410],[412,313],[833,679],[338,126],[504,261],[668,210],[861,328],[562,183],[233,159],[703,355],[715,170],[923,137],[712,164],[152,54],[856,810],[97,15],[681,486],[592,221],[448,368],[808,335],[388,333],[464,113],[416,44],[868,270],[314,121],[271,62],[250,240],[893,121],[360,326],[562,224],[573,281],[964,707],[252,162],[838,116],[425,115],[599,45],[763,518],[979,73],[346,173],[611,272],[749,27],[971,208],[683,596],[766,105],[877,404],[832,700],[523,478],[954,467],[366,220],[772,125],[978,281],[972,373],[520,240],[595,82],[433,253],[822,48],[951,826],[942,260],[871,416],[507,254],[569,384],[169,38],[648,134],[756,725],[131,69],[998,239],[308,49],[520,428],[984,798],[822,208],[694,547],[885,7],[453,395],[590,459],[602,400],[961,477],[479,200],[379,124],[939,854],[448,219],[770,129],[432,70],[671,178],[840,481],[975,354],[832,218],[674,133],[845,823],[771,512],[650,587],[675,96],[818,446],[800,8],[431,418],[838,186],[903,204],[627,556],[899,721],[450,64],[392,144],[514,219],[197,91],[970,106],[218,156],[514,265],[727,697],[869,597],[534,302],[596,545],[929,791],[733,267],[317,255],[783,169],[418,195],[397,358],[172,113],[744,575],[843,715],[556,384],[481,220],[810,455],[522,78],[787,527],[771,602],[949,701],[719,170],[592,162],[522,169],[844,473],[837,115],[994,470],[602,490],[789,694],[961,764],[760,94],[996,918],[541,506],[917,465],[974,342],[708,37],[813,138],[864,640],[599,285],[994,844],[272,27],[767,0],[764,40],[805,307],[899,88],[711,508],[646,469],[294,102],[961,735],[685,116],[429,105],[680,353],[921,104],[792,116],[748,316],[831,603],[903,594],[998,87],[898,697],[782,209],[330,282],[359,125],[453,225],[942,724],[851,844],[660,79],[430,197],[507,218],[752,98],[590,189],[733,128],[462,378],[662,562],[798,166],[350,148],[429,231],[770,547],[850,302],[855,401],[656,568],[428,309],[536,15],[109,9],[989,899],[305,44],[576,214],[415,114],[678,418],[360,98],[834,583],[569,551],[449,43],[703,647],[268,192],[265,68],[931,355],[928,25],[760,401],[537,169],[645,234],[970,865],[280,120],[954,787],[923,371],[720,63],[681,616],[740,228],[975,272],[799,122],[828,286],[600,331],[227,63],[462,319],[911,811],[707,321],[972,850],[541,1],[292,62],[543,22],[819,576],[858,54],[718,456],[421,301],[550,540],[241,99],[883,308],[636,60],[825,34],[605,445],[657,199],[631,573],[924,207],[585,475],[924,832],[673,167],[357,267],[971,672],[465,67],[930,520],[505,61],[453,330],[878,128],[755,748],[967,669],[852,443],[547,85],[365,126],[564,462],[359,294],[440,9],[978,440],[626,157],[781,503],[941,437],[775,336],[914,244],[701,687],[507,296],[269,175],[528,39],[350,128],[734,503],[189,166],[989,974],[518,249],[657,119],[821,746],[661,646],[378,173],[405,379],[393,0],[576,89],[444,37],[263,248],[936,799],[350,212],[740,537],[825,737],[938,667],[536,8],[431,267],[946,605],[946,587],[753,554],[660,603],[490,467],[291,287],[679,499],[807,585],[602,100],[823,661],[371,89],[903,809],[472,436],[726,187],[721,241],[849,576],[356,125],[377,38],[614,271],[607,536],[833,555],[543,49],[218,103],[776,396],[997,569],[539,191],[329,102],[321,90],[998,750],[717,53],[875,631],[753,623],[582,539],[571,269],[475,435],[639,294],[802,600],[724,720],[553,58],[928,212],[752,434],[533,391],[767,31],[819,580],[984,771],[756,172],[892,278],[945,83],[652,351],[46,26],[875,44],[275,234],[669,648],[794,551],[829,351],[622,251],[924,854],[573,411],[421,11],[975,277],[980,114],[593,557],[321,153],[900,815],[718,700],[603,573],[642,196],[491,189],[504,450],[786,766],[829,16],[824,193],[704,75],[562,5],[631,117],[639,137],[426,409],[425,123],[620,353],[515,217],[488,442],[774,663],[218,195],[158,149],[770,473],[206,139],[273,39],[888,283],[295,263],[440,333],[925,647],[470,318],[715,648],[614,100],[753,414],[947,98],[774,659],[667,574],[893,846],[967,565],[799,616],[121,96],[639,69],[762,635],[979,728],[280,140],[685,637],[910,563],[800,621],[865,288],[276,211],[828,268],[528,323],[858,393],[247,163],[586,87],[420,70],[373,81],[222,89],[926,533],[368,230],[910,223],[689,54],[526,153],[629,563],[768,262],[982,378],[537,502],[726,161],[762,453],[848,720],[958,109],[384,70],[595,289],[825,513],[773,540],[667,176],[728,533],[680,246],[175,145],[861,544],[508,340],[899,735],[465,432],[825,230],[782,383],[613,323],[826,658],[232,152],[805,192],[602,148],[916,528],[690,230],[628,412],[539,209],[993,355],[993,965],[688,70],[607,57],[645,445],[555,140],[124,36],[883,142],[927,874],[488,220],[357,69],[571,3],[427,64],[884,499],[184,100],[659,502],[766,625],[916,175],[660,477],[799,189],[821,519],[931,490],[843,791],[886,321],[745,124],[288,148],[826,288],[457,137],[711,351],[714,435],[383,281],[586,242],[523,399],[889,209],[800,276],[502,136],[678,45],[857,792],[724,216],[963,585],[718,383],[773,423],[555,119],[324,199],[975,293],[731,240],[872,110],[452,390],[641,57],[882,436],[854,129],[929,623],[261,211],[769,87],[569,252],[565,31],[853,266],[926,785],[657,311],[353,93],[781,113],[460,55],[728,122],[907,348],[713,574],[200,73],[741,602],[550,97],[805,8],[524,340],[538,306],[311,177],[619,477],[614,435],[847,244],[286,196],[761,628],[404,81],[544,47],[411,363],[492,366],[261,253],[416,309],[166,93],[523,296],[116,65],[718,649],[775,450],[856,362],[693,487],[470,98],[620,339],[353,277],[845,329],[925,524],[547,99],[556,58],[499,184],[293,70],[340,339],[663,566],[842,276],[428,221],[513,101],[870,586],[490,403],[683,357],[463,61],[270,150],[87,54],[886,849],[944,97],[392,343],[948,196],[921,862],[975,100],[720,138],[593,567],[825,789],[728,355],[409,406],[702,53],[374,111],[587,349],[927,563],[861,592],[881,846],[590,435],[693,402],[637,551],[871,8],[524,142],[846,739],[569,80],[884,223],[908,729],[810,492],[644,200],[882,220],[173,9],[831,638],[125,39],[534,529],[777,549],[598,325],[759,336],[327,5],[604,422],[211,28],[610,172],[213,54],[992,581],[665,615],[801,262],[789,64],[756,159],[509,61],[773,247],[778,456],[782,770],[814,595],[311,0],[843,197],[652,111],[588,473],[398,304],[687,213],[291,260],[151,5],[923,744],[658,301],[832,265],[460,344],[191,114],[662,334],[640,263],[410,249],[926,250],[486,327],[845,627],[735,7],[871,409],[878,751],[680,348],[900,161],[975,738],[905,53],[493,287],[887,286],[770,2],[890,401],[747,539],[195,154],[804,26],[865,763],[293,99],[455,399],[351,279],[792,146],[619,60],[669,482],[500,104],[262,42],[722,419],[974,9],[854,528],[998,904],[639,289],[422,408],[852,501],[917,909],[970,266],[608,268],[669,338],[761,320],[753,260],[698,318],[501,434],[685,425],[478,359],[376,267],[871,269],[683,636],[461,153],[588,257],[773,136],[919,894],[915,28],[990,244],[310,241],[852,588],[585,118],[621,322],[739,733],[206,94],[322,272],[829,386],[785,567],[615,282],[382,32],[868,29],[498,482],[922,501],[922,743],[775,654],[586,180],[887,234],[803,755],[305,85],[944,197],[545,207],[738,528],[586,219],[923,881],[803,491],[818,299],[902,495],[582,54],[973,481],[751,610],[936,95],[527,292],[251,99],[681,385],[895,341],[278,72],[432,251],[866,698],[914,171],[807,353],[850,26],[935,188],[982,822],[603,8],[688,316],[411,299],[910,828],[396,295],[991,37],[584,275],[325,302],[767,276],[217,170],[526,236],[900,173],[860,359],[581,34],[866,525],[344,303],[752,565],[65,23],[990,714],[401,35],[751,634],[895,703],[818,308],[973,340],[963,768],[824,718],[451,411],[948,733],[778,382],[434,92],[853,92],[711,163],[508,80],[481,379],[955,529],[310,83],[811,682],[804,55],[861,782],[267,157],[662,416],[334,311],[996,332],[640,24],[901,225],[896,514],[441,329],[694,601],[959,626],[863,683],[889,669],[181,114],[899,567],[292,166],[662,147],[298,294],[900,472],[843,67],[325,118],[979,99],[969,78],[613,186],[565,168],[843,316],[327,189],[418,7],[822,782],[402,212],[260,81],[695,360],[769,738],[990,193],[827,764],[791,772],[758,399],[93,50],[816,57],[564,426],[741,111],[855,561],[354,165],[776,735],[947,554],[996,970],[426,78],[815,377],[170,132],[694,340],[440,173],[182,179],[711,622],[524,347],[905,175],[454,442],[500,451],[417,267],[594,26],[902,111],[726,608],[603,125],[798,768],[462,239],[427,365],[66,11],[747,43],[950,688],[942,719],[935,796],[141,103],[970,844],[306,114],[791,229],[125,93],[759,636],[461,224],[407,154],[317,103],[754,344],[869,473],[618,39],[723,674],[748,440],[902,594],[925,396],[845,176],[492,370],[495,458],[840,636],[150,11],[264,106],[681,104],[796,9],[835,117],[666,314],[698,140],[654,528],[879,100],[649,319],[544,487],[46,8],[597,40],[654,410],[966,120],[363,156],[705,446],[846,677],[551,88],[395,28],[278,20],[709,103],[950,857],[699,427],[781,141],[750,700],[772,345],[552,223],[890,434],[854,132],[907,658],[598,107],[520,488],[999,572],[494,413],[744,98],[279,18],[305,302],[833,590],[404,45],[858,205],[34,16],[731,278],[301,103],[930,603],[854,704],[987,185],[938,568],[589,519],[318,76],[389,272],[479,379],[590,475],[816,699],[825,431],[701,689],[596,301],[823,196],[705,185],[901,671],[370,35],[682,20],[959,824],[753,438],[909,834],[628,512],[917,877],[530,497],[283,252],[954,594],[950,312],[644,183],[921,21],[528,490],[475,38],[501,34],[873,790],[369,346],[455,398],[863,765],[417,7],[836,209],[816,77],[233,229],[463,234],[713,98],[596,483],[705,146],[761,180],[451,146],[963,453],[309,73],[864,806],[669,375],[817,740],[674,70],[254,179],[545,130],[907,874],[744,43],[616,323],[577,543],[634,481],[868,600],[235,220],[476,235],[842,209],[895,36],[460,181],[99,74],[990,26],[869,334],[420,419],[861,404],[634,25],[911,53],[647,300],[842,129],[621,47],[956,2],[821,260],[921,96],[610,384],[238,137],[679,524],[859,762],[491,364],[777,239],[569,462],[484,430],[766,199],[467,354],[791,113],[887,318],[556,23],[883,101],[537,528],[644,409],[925,455],[750,733],[671,176],[881,425],[954,222],[857,709],[492,411],[193,169],[504,7],[704,393],[220,196],[345,112],[914,73],[833,490],[763,632],[240,53],[170,82],[598,137],[592,579],[581,0],[807,639],[137,122],[970,243],[838,582],[380,293],[612,508],[337,112],[425,274],[740,99],[733,432],[891,390],[922,202],[993,470],[967,22],[741,411],[836,812],[626,596],[787,462],[860,283],[882,746],[947,703],[368,68],[796,255],[947,814],[825,822],[832,185],[215,8],[850,161],[918,376],[700,588],[542,297],[774,127],[144,129],[422,37],[808,640],[908,508],[926,332],[352,256],[684,411],[664,127],[638,433],[830,91],[124,118],[715,588],[787,147],[670,21],[821,297],[731,269],[251,15],[745,385],[595,581],[636,102],[272,212],[432,414],[595,68],[761,43],[986,723],[455,182],[736,240],[274,220],[480,78],[828,801],[676,65],[555,86],[801,27],[521,0],[516,206],[897,490],[959,821],[970,628],[965,575],[824,413],[335,151],[658,247],[554,125],[554,26],[559,290],[988,91],[714,444],[286,87],[178,141],[652,221],[647,533],[787,210],[668,313],[484,49],[741,327],[926,506],[935,744],[593,287],[740,356],[676,162],[741,321],[553,484],[889,166],[812,680],[690,684],[876,604],[768,336],[612,188],[525,301],[634,262],[762,113],[620,457],[644,528],[553,119],[586,63],[523,474],[529,35],[939,601],[322,12],[827,83],[751,186],[498,70],[911,637],[657,259],[750,316],[883,876],[834,444],[831,161],[531,360],[990,754],[739,314],[723,73],[824,46],[783,598],[441,371],[120,1],[893,680],[471,373],[593,333],[866,398],[927,923],[710,234],[41,30],[864,298],[821,227],[680,566],[961,404],[504,431],[54,53],[606,405],[984,658],[840,467],[72,45],[405,32],[674,191],[811,754],[824,171],[529,236],[324,213],[892,507],[676,505],[954,143],[331,182],[752,319],[712,587],[870,784],[886,838],[876,798],[264,228],[823,640],[285,244],[439,280],[352,7],[360,69],[943,725],[911,374],[960,9],[843,219],[911,144],[866,602],[934,260],[378,160],[713,508],[715,670],[308,153],[579,349],[912,824],[985,322],[905,637],[354,167],[985,172],[170,81],[434,256],[638,450],[956,160],[827,521],[588,373],[839,646],[938,549],[783,352],[660,197],[432,85],[734,563],[639,250],[408,187],[507,244],[691,11],[941,436],[594,579],[754,243],[541,409],[907,183],[260,37],[368,195],[803,3],[419,259],[926,550],[685,185],[217,85],[863,822],[472,254],[905,190],[434,374],[486,352],[707,250],[716,247],[47,6],[438,174],[538,350],[289,170],[671,101],[768,704],[597,464],[846,128],[511,330],[559,269],[260,72],[953,59],[871,793],[808,297],[718,228],[665,109],[886,532],[845,355],[937,96],[472,73],[206,0],[23,8],[773,418],[769,450],[296,113],[81,67],[745,498],[379,83],[644,48],[943,594],[427,127],[829,561],[851,741],[158,153],[891,266],[469,102],[685,104],[446,16],[976,314],[641,475],[361,125],[890,863],[150,27],[489,242],[840,838],[849,630],[566,440],[892,279],[675,576],[848,149],[697,543],[863,11],[549,255],[409,214],[565,169],[825,816],[599,268],[946,857],[584,530],[463,156],[437,104],[972,56],[483,217],[720,517],[745,398],[924,904],[700,284],[710,490],[904,701],[511,322],[452,159],[676,475],[880,428],[689,360],[541,229],[680,215],[806,614],[809,411],[383,110],[587,124],[770,314],[945,310],[406,252],[852,732],[952,628],[871,292],[579,488],[717,703],[480,418],[994,650],[967,695],[844,187],[873,101],[804,696],[902,727],[701,171],[930,430],[404,397],[744,216],[954,541],[711,472],[243,140],[428,188],[714,180],[376,18],[789,314],[974,133],[783,611],[639,506],[886,541],[703,303],[966,710],[471,329],[662,63],[798,619],[935,413],[509,249],[983,111],[81,3],[930,404],[426,187],[237,53],[795,233],[685,190],[615,533],[382,373],[555,475],[856,43],[900,395],[500,164],[610,305],[777,179],[668,446],[228,62],[932,14],[786,776],[767,340],[892,642],[793,616],[987,148],[532,85],[874,392],[386,165],[911,221],[242,97],[461,126],[583,124],[778,547],[649,99],[209,89],[670,153],[821,405],[312,221],[930,875],[526,440],[453,452],[121,69],[682,472],[840,413],[876,277],[481,3],[837,442],[96,94],[756,133],[711,442],[448,85],[911,870],[547,328],[482,280],[774,408],[597,505],[710,220],[574,242],[917,218],[506,288],[865,275],[472,15],[968,55],[802,432],[488,271],[358,244],[920,500],[242,11],[689,548],[899,561],[900,24],[454,18],[948,846],[692,109],[797,176],[417,28],[685,656],[941,566],[150,18],[214,192],[768,113],[596,299],[405,404],[919,282],[581,497],[926,848],[770,460],[718,126],[730,709],[494,164],[283,245],[939,646],[587,360],[879,465],[534,463],[685,21],[702,186],[669,524],[205,152],[512,199],[487,384],[847,15],[792,232],[392,35],[697,411],[708,388],[488,420],[740,192],[559,292],[753,376],[966,227],[783,552],[739,6],[729,322],[224,181],[273,204],[164,136],[258,64],[899,132],[487,239],[819,585],[806,229],[786,531],[907,76],[669,324],[532,175],[679,397],[336,274],[664,45],[650,622],[875,620],[470,216],[840,230],[323,114],[702,700],[908,724],[738,473],[642,227],[514,187],[998,41],[457,9],[968,263],[485,266],[283,196],[692,24],[577,309],[684,593],[927,572],[469,111],[996,511],[976,322],[975,880],[935,896],[889,534],[838,653],[896,879],[400,217],[915,350],[522,9],[568,348],[740,393],[237,113],[956,793],[736,719],[763,468],[707,177],[817,73],[843,570],[943,23],[400,73],[802,618],[756,54],[355,8],[501,155],[418,382],[531,14],[772,472],[217,111],[686,622],[730,91],[577,311],[668,650],[767,623],[465,46],[952,43],[633,589],[238,85],[904,289],[764,283],[667,635],[968,370],[237,103],[907,157],[495,241],[953,32],[323,176],[892,489],[912,491],[665,234],[990,626],[884,716],[416,37],[734,17],[270,195],[768,434],[640,12],[881,530],[801,232],[380,113],[558,374],[360,53],[773,145],[499,69],[890,391],[349,308],[831,281],[149,28],[416,192],[928,581],[782,740],[696,536],[974,677],[859,582],[429,257],[390,297],[732,146],[477,26],[293,22],[546,457],[434,138],[575,309],[981,31],[763,488],[884,404],[485,413],[979,264],[564,388],[751,328],[746,616],[535,315],[742,147],[872,439],[554,212],[823,393],[838,379],[882,570],[647,498],[339,157],[392,216],[988,643],[496,11],[654,199],[403,137],[622,284],[818,692],[663,498],[204,150],[829,158],[765,190],[696,225],[904,366],[774,682],[904,270],[741,295],[707,37],[832,6],[735,85],[946,858],[914,193],[530,45],[862,147],[481,48],[426,321],[221,166],[689,174],[993,956],[587,389],[725,445],[976,465],[737,623],[847,770],[579,404],[862,469],[945,15],[703,4],[578,506],[637,530],[698,142],[908,803],[700,166],[478,17],[551,404],[597,459],[396,162],[598,579],[683,358],[630,385],[636,128],[751,440],[635,219],[987,428],[890,274],[918,877],[960,58],[883,505],[829,223],[842,381],[955,249],[547,528],[621,229],[775,204],[792,506],[579,285],[103,53],[352,147],[932,89],[774,571],[969,932],[405,184],[546,462],[924,550],[245,95],[922,582],[802,427],[750,296],[934,791],[707,196],[924,94],[605,536],[111,59],[472,364],[402,65],[559,323],[666,541],[881,698],[658,605],[435,127],[847,725],[756,199],[427,355],[900,42],[859,649],[565,112],[950,692],[965,318],[956,300],[754,692],[930,735],[704,179],[987,748],[931,586],[952,459],[733,557],[304,263],[949,524],[519,465],[718,106],[128,27],[451,362],[485,183],[890,95],[631,384],[579,207],[778,371],[333,279],[747,437],[942,389],[779,470],[255,218],[791,432],[718,291],[700,487],[906,549],[206,114],[440,224],[486,143],[741,184],[983,955],[815,14],[837,487],[369,148],[586,577],[408,56],[641,175],[860,809],[706,448],[798,631],[682,21],[387,146],[845,299],[253,184],[540,311],[930,568],[714,533],[794,705],[916,573],[644,260],[782,414],[366,187],[720,366],[582,317],[506,54],[855,65],[637,76],[372,55],[464,127],[650,143],[672,182],[579,327],[915,378],[614,50],[691,576],[642,483],[897,222],[754,437],[910,860],[851,486],[363,279],[971,438],[988,369],[696,592],[764,251],[286,163],[775,264],[992,843],[791,540],[295,127],[897,419],[488,307],[915,311],[805,259],[544,180],[959,615],[951,704],[807,752],[208,69],[658,372],[462,387],[994,495],[804,251],[229,119],[456,137],[624,120],[876,818],[921,221],[910,475],[480,215],[266,153],[812,714],[651,42],[451,430],[123,120],[786,235],[960,645],[428,26],[717,569],[717,243],[865,757],[910,119],[637,354],[344,225],[276,50],[931,471],[951,657],[992,416],[833,151],[503,56],[691,600],[581,574],[877,511],[232,63],[79,1],[196,136],[521,379],[273,99],[531,125],[766,364],[875,719],[723,238],[804,677],[256,156],[275,35],[652,535],[948,20],[602,16],[816,90],[322,71],[937,228],[283,193],[568,90],[642,498],[948,935],[336,288],[410,245],[241,92],[512,457],[897,766],[368,12],[799,568],[62,5],[952,312],[761,256],[744,71],[361,168],[154,43],[556,278],[883,667],[560,542],[228,211],[836,723],[740,417],[887,719],[563,160],[589,531],[421,18],[734,364],[883,841],[910,320],[944,740],[570,538],[969,666],[642,596],[856,462],[654,14],[682,245],[225,223],[882,329],[774,448],[506,379],[734,570],[906,43],[363,198],[532,324],[450,119],[666,385],[928,323],[494,58],[758,561],[950,752],[589,360],[858,344],[985,524],[744,217],[546,374],[788,246],[726,236],[903,565],[758,669],[510,501],[794,681],[738,717],[697,224],[413,65],[867,149],[734,448],[973,259],[274,55],[891,285],[890,171],[844,124],[773,641],[451,447],[155,120],[950,758],[588,60],[620,608],[679,153],[577,179],[674,376],[866,174],[991,664],[866,814],[841,540],[431,273],[839,717],[767,284],[212,12],[536,289],[269,234],[700,39],[158,147],[975,733],[935,809],[139,61],[719,387],[941,19],[341,160],[273,24],[900,238],[758,615],[913,46],[606,481],[402,103],[847,434],[891,356],[567,363],[949,68],[419,308],[243,60],[791,688],[562,414],[880,621],[965,287],[379,342],[991,281],[613,86],[426,127],[526,23],[412,57],[932,740],[808,497],[609,379],[736,74],[762,574],[995,510],[742,596],[691,386],[915,135],[801,529],[530,527],[323,223],[798,453],[814,668],[808,162],[351,334],[618,400],[665,321],[289,161],[659,237],[954,561],[473,437],[522,489],[863,136],[438,2],[874,142],[734,184],[920,831],[882,315],[544,285],[213,205],[693,213],[912,230],[361,136],[738,375],[604,51],[561,355],[592,561],[432,303],[851,74],[917,33],[847,113],[626,368],[684,188],[605,559],[956,591],[410,334],[694,69],[868,563],[360,55],[779,449],[817,17],[543,244],[654,559],[968,43],[703,49],[708,506],[966,791],[335,139],[449,195],[377,48],[963,253],[669,155],[930,369],[678,267],[852,808],[511,43],[681,437],[42,16],[828,82],[589,317],[857,517],[557,102],[913,339],[842,549],[514,80],[447,288],[40,8],[633,285],[620,445],[812,256],[666,628],[375,235],[639,175],[471,54],[692,587],[784,572],[543,120],[285,249],[227,145],[980,494],[416,81],[993,559],[152,107],[690,40],[740,403],[440,421],[711,422],[437,2],[711,262],[731,91],[939,632],[490,387],[359,111],[955,35],[712,406],[978,697],[894,838],[745,448],[919,875],[917,826],[332,158],[859,285],[641,599],[982,68],[649,443],[62,17],[803,68],[884,133],[401,47],[940,780],[431,363],[994,295],[960,630],[742,594],[98,29],[545,353],[946,222],[558,308],[968,344],[977,510],[688,306],[930,179],[938,560],[422,193],[778,688],[225,6],[491,401],[298,73],[295,238],[611,286],[451,192],[464,40],[901,791],[706,22],[997,386],[933,631],[780,198],[763,638],[821,640],[519,109],[938,766],[737,375],[958,801],[953,295],[764,327],[260,222],[772,144],[436,299],[326,83],[876,95],[473,137],[696,674],[560,354],[934,788],[627,336],[536,20],[427,393],[549,534],[997,675],[787,390],[701,504],[787,181],[457,109],[847,220],[830,517],[795,174],[243,118],[996,492],[982,130],[46,17],[697,8],[947,232],[825,545],[603,356],[681,565],[463,58],[506,237],[651,406],[824,607],[945,644],[938,927],[712,601],[691,656],[413,5],[585,178],[639,636],[717,593],[276,155],[639,211],[284,223],[950,95],[591,414],[944,670],[602,592],[486,65],[971,955],[755,116],[687,10],[355,79],[701,148],[725,696],[633,455],[226,136],[435,152],[564,178],[828,328],[780,299],[157,0],[569,107],[509,452],[990,510],[390,316],[891,115],[851,641],[447,195],[665,171],[658,375],[953,671],[945,547],[42,1],[759,85],[769,86],[488,208],[422,121],[685,666],[757,0],[521,220],[367,309],[610,53],[612,69],[765,207],[802,404],[514,263],[766,695],[714,522],[258,168],[602,93],[879,446],[501,181],[627,214],[763,363],[468,251],[486,14],[917,526],[956,140],[332,85],[978,379],[712,693],[952,633],[717,505],[408,36],[880,430],[985,710],[443,375],[509,326],[397,261],[950,864],[837,553],[841,756],[763,680],[970,778],[823,444],[439,111],[591,241],[356,117],[512,22],[897,342],[467,379],[866,605],[472,17],[317,192],[340,314],[651,424],[593,405],[761,292],[809,691],[645,610],[522,38],[600,373],[872,235],[757,737],[393,242],[661,530],[983,451],[435,149],[869,98],[513,380],[918,145],[710,25],[531,192],[414,105],[721,84],[449,155],[896,567],[913,728],[799,582],[936,528],[487,482],[772,622],[614,578],[827,652],[823,440],[940,927],[582,330],[723,363],[802,540],[410,394],[582,228],[970,521],[566,386],[786,124],[987,982],[457,311],[389,352],[988,694],[782,393],[571,103],[988,716],[756,359],[718,155],[998,202],[253,236],[975,822],[92,58],[439,394],[610,456],[812,369],[471,57],[814,601],[145,136],[975,632],[481,370],[509,70],[845,748],[603,434],[774,477],[900,714],[753,442],[942,635],[112,40],[634,621],[708,61],[374,132],[939,636],[255,172],[154,98],[688,195],[917,102],[540,520],[426,117],[661,350],[987,749],[991,334],[932,522],[469,377],[78,54],[800,404],[604,284],[804,308],[738,61],[507,227],[893,506],[145,13],[252,241],[853,342],[502,348],[644,345],[315,97],[852,184],[371,206],[818,121],[673,355],[987,911],[727,388],[857,445],[831,511],[830,536],[716,60],[378,267],[179,152],[820,512],[321,221],[247,146],[416,206],[411,216],[780,466],[527,475],[777,706],[714,703],[575,567],[450,85],[190,92],[507,351],[779,338],[325,181],[287,255],[919,620],[284,20],[853,391],[884,605],[840,495],[665,509],[779,250],[498,42],[928,35],[972,954],[890,598],[736,18],[540,91],[824,69],[674,584],[227,132],[672,40],[757,72],[579,290],[275,154],[921,292],[768,344],[697,344],[971,193],[322,6],[565,38],[260,15],[946,488],[526,243],[531,35],[588,242],[662,403],[869,389],[882,610],[794,207],[61,60],[339,80],[935,235],[966,911],[878,758],[891,541],[910,421],[804,475],[855,580],[569,139],[841,236],[715,264],[803,754],[981,209],[486,86],[899,62],[998,645],[553,229],[694,268],[409,293],[785,280],[480,258],[842,32],[646,445],[806,156],[818,194],[423,248],[333,68],[445,170],[535,304],[850,714],[604,557],[445,13],[352,179],[640,240],[914,837],[961,772],[740,305],[272,117],[924,225],[784,561],[410,188],[373,253],[797,720],[545,243],[734,86],[729,584],[907,17],[508,119],[857,641],[882,390],[586,120],[999,378],[861,489],[517,251],[830,756],[518,460],[359,204],[980,371],[993,493],[395,353],[644,588],[931,795],[248,142],[887,818],[936,134],[697,136],[581,164],[280,99],[342,226],[428,282],[883,524],[580,2],[986,164],[689,265],[685,484],[667,56],[258,113],[368,11],[860,86],[919,108],[972,101],[661,524],[906,711],[324,154],[730,278],[492,273],[943,559],[693,100],[876,803],[496,286],[725,553],[446,414],[518,137],[890,695],[969,130],[570,220],[964,441],[196,142],[646,175],[426,44],[564,343],[553,445],[408,399],[567,416],[823,434],[857,681],[49,44],[913,712],[538,115],[852,597],[561,388],[941,354],[864,104],[978,263],[422,323],[617,90],[550,414],[974,124],[579,380],[938,338],[770,563],[342,286],[776,481],[219,201],[769,49],[943,16],[632,93],[123,94],[420,266],[852,821],[703,218],[909,4],[298,63],[624,185],[941,426],[697,40],[516,41],[721,644],[599,25],[722,111],[636,145],[912,785],[828,776],[449,314],[220,139],[618,86],[396,383],[945,0],[740,401],[700,455],[967,492],[888,574],[944,84],[223,69],[763,249],[401,54],[255,175],[249,49],[976,283],[381,257],[754,710],[959,881],[718,677],[577,437],[203,50],[480,237],[977,280],[469,47],[510,414],[900,348],[708,352],[878,670],[686,519],[661,155],[702,461],[925,212],[224,200],[955,516],[917,790],[755,679],[210,149],[697,432],[845,472],[886,524],[483,328],[871,413],[926,516],[784,46],[530,49],[717,476],[764,623],[886,659],[759,541],[822,485],[835,261],[298,142],[751,429],[393,111],[423,176],[925,321],[810,345],[654,499],[546,119],[966,114],[820,251],[414,293],[897,830],[311,167],[827,409],[496,212],[488,104],[177,63],[880,740],[781,152],[308,87],[685,570],[651,219],[736,270],[544,52],[984,982],[193,109],[254,148],[737,557],[824,232],[549,109],[299,6],[640,548],[602,171],[587,216],[776,752],[641,388],[810,606],[805,17],[614,29],[920,620],[388,0],[264,164],[644,565],[741,59],[558,272],[963,148],[727,191],[281,238],[798,793],[729,623],[577,237],[691,269],[267,200],[656,205],[928,401],[906,417],[638,27],[624,418],[360,15],[672,29],[233,197],[968,218],[922,411],[794,422],[916,902],[979,809],[913,169],[564,9],[621,491],[770,724],[968,466],[662,517],[801,662],[467,87],[610,511],[153,123],[598,81],[336,325],[851,279],[603,422],[460,378],[698,322],[823,3],[974,33],[979,385],[897,839],[199,193],[772,321],[972,821],[639,124],[927,760],[299,270],[591,308],[530,32],[717,537],[115,95],[721,586],[622,486],[917,356],[686,103],[940,494],[767,562],[847,826],[730,633],[900,352],[854,144],[502,444],[933,477],[708,166],[865,852],[414,203],[945,98],[283,270],[612,306],[781,178],[693,130],[328,81],[813,761],[688,30],[551,277],[787,371],[391,177],[854,591],[196,176],[601,364],[69,34],[826,244],[981,509],[659,415],[997,341],[478,440],[534,161],[958,538],[415,161],[652,222],[331,112],[966,273],[612,328],[843,285],[719,301],[609,380],[920,11],[973,827],[753,713],[824,288],[706,604],[995,192],[889,460],[423,112],[409,303],[247,49],[506,242],[822,553],[320,16],[724,277],[804,223],[943,108],[799,467],[311,155],[549,502],[266,178],[979,483],[470,158],[988,431],[626,215],[512,30],[824,123],[414,189],[135,100],[919,863],[456,229],[453,246],[629,475],[928,765],[327,293],[685,263],[760,435],[388,169],[819,292],[914,619],[957,46],[863,488],[634,348],[241,161],[623,567],[548,446],[912,581],[47,21],[790,748],[327,218],[672,30],[974,71],[845,504],[924,20],[775,40],[891,813],[527,53],[681,382],[962,278],[657,461],[746,508],[874,397],[700,170],[740,140],[924,456],[321,258],[952,457],[797,491],[806,21],[789,67],[788,78],[854,138],[544,59],[752,586],[783,577],[763,90],[469,82],[259,76],[941,222],[742,358],[684,142],[483,161],[436,284],[518,30],[821,724],[559,411],[412,216],[434,295],[864,357],[444,177],[480,76],[634,575],[812,35],[586,408],[343,332],[955,496],[851,460],[709,644],[907,879],[914,439],[918,733],[763,446],[746,109],[924,219],[619,4],[900,405],[860,504],[827,399],[824,6],[479,243],[545,504],[820,217],[747,67],[242,74],[964,68],[678,335],[752,683],[595,300],[919,387],[817,232],[453,329],[300,269],[993,767],[730,287],[333,264],[348,308],[741,345],[712,594],[380,268],[724,458],[998,327],[423,118],[85,21],[911,294],[978,896],[619,367],[581,486],[885,80],[399,177],[973,441],[273,104],[413,299],[745,266],[913,303],[966,472],[919,558],[658,657],[479,415],[391,274],[941,654],[962,803],[799,694],[296,131],[507,208],[779,401],[890,283],[564,523],[964,36],[661,562],[599,354],[992,930],[662,370],[718,393],[373,351],[651,560],[376,323],[437,398],[841,365],[354,5],[843,229],[635,224],[821,725],[732,346],[268,103],[842,410],[716,23],[130,97],[730,195],[666,539],[187,113],[800,242],[874,236],[835,286],[634,388],[819,303],[511,11],[997,343],[857,633],[836,260],[517,276],[425,256],[529,360],[675,628],[990,548],[935,715],[547,417],[408,9],[965,204],[728,483],[915,365],[73,41],[597,171],[356,79],[215,209],[989,557],[510,336],[860,62],[796,539],[447,49],[306,126],[643,578],[487,200],[413,20],[666,54],[979,535],[823,76],[927,825],[403,15],[680,665],[859,105],[917,185],[923,409],[728,85],[660,45],[848,675],[518,325],[913,753],[839,234],[741,517],[398,175],[813,201],[527,525],[728,719],[746,500],[428,124],[763,570],[970,175],[176,111],[903,281],[959,864],[702,509],[491,478],[673,242],[594,157],[226,193],[812,749],[944,722],[447,436],[900,258],[724,201],[846,686],[648,317],[529,244],[876,841],[631,272],[662,551],[680,282],[375,325],[986,825],[863,142],[816,284],[711,439],[656,382],[629,95],[677,14],[940,842],[938,353],[478,209],[711,215],[219,207],[770,430],[980,328],[802,42],[575,190],[896,172],[577,269],[321,230],[932,372],[737,495],[861,9],[607,425],[948,892],[847,748],[944,237],[897,213],[727,226],[210,64],[332,19],[919,834],[939,839],[800,499],[262,227],[118,47],[676,613],[935,515],[214,93],[813,708],[514,84],[462,124],[989,195],[213,147],[897,577],[682,408],[849,431],[235,175],[653,566],[695,371],[845,123],[947,726],[674,345],[429,329],[593,96],[625,133],[622,585],[776,70],[376,223],[461,290],[393,180],[885,266],[947,441],[958,301],[906,215],[103,86],[675,508],[642,499],[500,440],[959,279],[940,96],[835,393],[565,442],[875,672],[603,321],[605,495],[782,762],[72,52],[982,889],[220,138],[831,209],[203,133],[966,764],[663,494],[247,124],[996,692],[574,309],[567,417],[598,216],[836,314],[820,750],[204,120],[658,555],[420,406],[729,414],[665,152],[594,361],[492,490],[426,344],[741,320],[22,2],[581,12],[898,67],[924,883],[513,312],[618,204],[586,483],[619,474],[936,341],[799,297],[905,698],[423,400],[860,157],[747,225],[121,27],[477,249],[579,516],[415,0],[107,30],[980,187],[709,123],[818,383],[528,198],[874,824],[836,352],[504,97],[266,125],[862,192],[914,412],[424,145],[545,268],[326,173],[494,198],[900,758],[512,458],[431,406],[77,17],[715,558],[634,391],[449,444],[834,361],[645,299],[687,250],[957,168],[851,150],[809,551],[801,264],[845,469],[551,156],[935,710],[812,236],[806,104],[225,106],[187,53],[272,58],[644,101],[837,346],[964,263],[323,5],[942,355],[651,513],[338,108],[855,134],[872,611],[710,227],[679,403],[901,799],[372,36],[724,336],[403,328],[920,358],[656,454],[583,514],[767,217],[754,494],[861,637],[918,199],[907,582],[639,616],[220,81],[670,57],[583,315],[322,4],[703,650],[867,232],[944,824],[798,384],[723,552],[42,31],[899,264],[628,509],[859,430],[609,479],[984,208],[835,91],[275,266],[546,436],[498,108],[875,481],[950,101],[920,217],[807,9],[826,205],[873,809],[972,705],[867,641],[841,110],[785,530],[284,64],[363,326],[358,38],[186,119],[641,2],[952,861],[906,309],[832,449],[414,136],[874,619],[881,331],[853,236],[230,118],[775,524],[340,154],[771,525],[936,894],[831,495],[830,785],[758,676],[564,169],[718,355],[856,148],[838,751],[523,355],[703,451],[834,427],[440,396],[984,362],[595,89],[690,185],[492,122],[898,394],[495,346],[931,735],[699,67],[728,364],[892,49],[904,688],[270,19],[878,3],[464,96],[261,47],[194,50],[923,531],[587,24],[995,729],[726,484],[466,325],[387,138],[675,53],[554,143],[603,486],[710,174],[546,360],[912,349],[467,143],[754,584],[214,104],[371,136],[761,415],[679,135],[632,584],[530,360],[789,741],[584,112],[533,89],[981,865],[759,484],[926,92],[867,633],[711,490],[992,751],[990,913],[846,391],[898,767],[748,353],[860,261],[752,146],[867,638],[928,235],[379,77],[752,723],[902,271],[925,150],[522,261],[844,300],[896,442],[810,641],[817,226],[769,267],[976,399],[377,360],[717,680],[994,258],[738,298],[929,863],[250,147],[833,100],[695,355],[709,526],[463,418],[592,525],[958,363],[385,243],[529,273],[840,541],[575,451],[443,407],[639,399],[841,486],[564,244],[642,199],[553,99],[976,65],[901,137],[904,837],[708,64],[496,18],[399,80],[383,99],[288,115],[973,221],[784,463],[637,27],[824,495],[719,358],[408,29],[660,283],[708,211],[678,415],[928,462],[904,297],[277,125],[832,826],[484,110],[342,136],[409,15],[980,103],[773,276],[929,99],[865,307],[824,176],[948,112],[760,697],[485,33],[545,525],[947,73],[713,336],[992,518],[661,245],[405,72],[292,130],[858,109],[703,467],[378,83],[945,239],[313,228],[436,184],[220,199],[566,418],[697,660],[302,257],[603,389],[853,667],[372,78],[862,794],[629,250],[793,232],[633,157],[630,386],[965,152],[988,860],[728,509],[872,287],[533,339],[741,364],[857,508],[816,247],[439,295],[887,822],[676,456],[827,819],[611,577],[508,376],[374,104],[248,33],[865,169],[878,1],[660,52],[557,204],[630,579],[923,9],[747,273],[609,499],[615,515],[869,549],[716,695],[409,215],[211,188],[545,262],[322,308],[616,19],[780,740],[737,364],[296,265],[735,540],[957,863],[914,641],[164,2],[500,41],[958,905],[540,425],[645,595],[575,511],[888,120],[746,83],[974,495],[637,307],[930,621],[521,273],[842,681],[741,158],[558,14],[353,340],[722,103],[934,114],[877,436],[683,212],[859,504],[604,249],[260,146],[949,944],[804,36],[669,74],[435,118],[888,238],[817,157],[431,423],[951,332],[589,587],[929,243],[321,118],[821,208],[757,218],[718,415],[345,278],[232,186],[479,158],[570,367],[538,173],[953,15],[615,587],[715,627],[642,460],[946,830],[648,469],[433,357],[561,298],[848,289],[973,659],[372,17],[692,13],[615,274],[752,370],[599,567],[582,339],[520,343],[583,491],[532,188],[575,450],[861,797],[919,459],[825,762],[988,35],[891,789],[167,24],[118,41],[534,41],[587,525],[463,196],[626,236],[793,440],[625,58],[975,777],[854,353],[762,67],[853,429],[835,127],[578,246],[554,302],[910,24],[776,754],[694,621],[660,46],[883,176],[933,920],[770,710],[851,51],[983,676],[994,335],[527,316],[399,136],[704,5],[666,408],[951,546],[879,282],[872,83],[786,468],[384,292],[889,874],[889,343],[502,345],[572,275],[758,542],[285,71],[895,775],[669,254],[701,591],[683,141],[735,200],[430,361],[598,384],[399,278],[804,6],[852,792],[611,382],[808,799],[476,181],[868,481],[89,40],[947,785],[645,203],[822,68],[745,413],[379,198],[936,44],[648,235],[393,322],[920,477],[420,343],[455,351],[918,443],[883,532],[648,561],[993,639],[934,19],[954,47],[467,39],[701,269],[77,10],[784,26],[187,137],[901,185],[674,275],[964,946],[736,598],[490,463],[927,838],[348,318],[39,25],[955,63],[192,14],[811,267],[514,276],[893,567],[602,568],[919,325],[332,16],[711,444],[873,230],[903,406],[973,346],[762,722],[763,31],[128,12],[988,794],[189,40],[449,308],[456,88],[835,572],[262,69],[609,539],[922,147],[634,38],[883,703],[874,579],[387,85],[986,170],[272,199],[831,774],[988,934],[709,616],[832,714],[714,153],[609,398],[799,5],[940,107],[626,489],[349,346],[600,254],[461,193],[769,7],[661,31],[740,635],[394,47],[217,50],[413,86],[753,419],[664,143],[852,493],[270,235],[808,731],[777,480],[293,239],[240,68],[899,510],[469,440],[869,845],[928,852],[911,854],[472,136],[856,480],[805,647],[928,902],[992,119],[354,53],[984,518],[446,162],[855,545],[958,545],[764,570],[933,280],[24,3],[701,445],[914,553],[195,29],[762,755],[793,776],[438,336],[558,286],[953,655],[441,88],[378,154],[890,876],[757,140],[517,41],[197,55],[875,648],[829,62],[743,671],[834,375],[814,219],[781,581],[822,395],[925,87],[622,592],[664,108],[153,125],[294,194],[200,158],[715,609],[367,222],[672,37],[521,447],[999,215],[967,935],[966,23],[331,226],[971,448],[635,145],[913,686],[564,478],[746,700],[924,159],[552,407],[366,303],[809,240],[175,45],[911,131],[519,313],[618,117],[842,416],[671,499],[706,357],[724,166],[929,247],[983,782],[78,64],[310,236],[370,269],[895,88],[766,473],[767,165],[557,519],[259,74],[243,143],[234,25],[828,718],[930,616],[914,255],[220,173],[426,111],[450,404],[562,239],[779,606],[389,23],[861,141],[556,165],[307,32],[344,277],[900,5],[643,110],[509,200],[862,623],[234,203],[469,113],[176,130],[964,841],[339,131],[725,590],[768,749],[599,387],[472,210],[724,53],[326,197],[801,540],[760,282],[254,130],[997,542],[954,808],[203,28],[735,310],[923,282],[531,218],[978,976],[979,53],[532,306],[702,406],[471,365],[964,875],[790,175],[924,72],[747,550],[906,480],[280,148],[255,144],[875,116],[291,123],[730,529],[812,767],[403,345],[984,572],[981,542],[680,193],[523,285],[781,693],[370,193],[139,14],[83,71],[856,510],[914,274],[582,422],[917,606],[933,108],[695,1],[967,415],[798,280],[550,184],[698,512],[661,390],[961,1],[686,24],[808,65],[433,305],[891,857],[611,168],[443,95],[912,288],[333,191],[862,568],[839,773],[499,227],[243,89],[683,366],[717,267],[857,367],[388,383],[528,143],[741,76],[888,829],[873,812],[871,5],[648,545],[799,301],[985,833],[701,147],[850,849],[714,635],[434,318],[933,853],[809,499],[929,790],[998,130],[770,6],[671,209],[161,115],[930,155],[852,175],[991,68],[932,70],[447,381],[660,342],[776,540],[546,441],[398,83],[354,72],[702,475],[752,214],[509,52],[958,583],[754,7],[728,88],[941,172],[834,136],[496,477],[907,165],[501,111],[630,483],[781,269],[589,21],[619,435],[709,426],[587,551],[422,25],[773,184],[983,344],[915,635],[594,214],[342,76],[107,9],[942,779],[487,280],[998,793],[720,609],[998,693],[750,447],[720,439],[933,703],[932,722],[351,35],[971,103],[691,453],[980,576],[953,69],[854,493],[272,82],[983,103],[771,361],[862,530],[992,517],[777,678],[843,556],[593,548],[370,303],[875,196],[659,508],[846,837],[878,685],[619,511],[442,266],[997,376],[847,842],[275,232],[401,151],[723,668],[901,884],[698,350],[785,252],[792,584],[621,112],[887,3],[641,139],[861,516],[427,107],[357,172],[561,541],[811,677],[936,646],[779,374],[606,435],[838,637],[964,625],[900,338],[346,10],[577,438],[909,734],[743,497],[692,204],[984,632],[529,322],[623,484],[917,476],[606,347],[133,108],[531,254],[905,838],[958,86],[594,411],[810,691],[402,201],[900,705],[390,77],[965,195],[172,67],[970,653],[794,667],[505,176],[698,553],[889,685],[741,667],[535,174],[836,568],[872,684],[546,271],[921,615],[792,670],[583,234],[197,107],[406,150],[405,211],[344,13],[679,170],[150,113],[158,124],[997,49],[537,105],[721,78],[405,114],[974,812],[794,339],[633,367],[908,63],[556,443],[886,776],[603,23],[749,681],[941,860],[557,504],[544,474],[708,597],[953,761],[662,103],[566,315],[490,141],[924,825],[174,93],[647,158],[665,207],[627,0],[877,662],[385,214],[895,103],[983,55],[787,494],[424,28],[520,96],[360,83],[957,615],[448,301],[744,385],[822,263],[392,73],[919,664],[31,26],[368,35],[790,724],[879,763],[987,340],[742,193],[940,412],[993,949],[309,151],[514,323],[907,456],[961,355],[856,418],[830,22],[924,450],[709,525],[167,15],[586,280],[477,381],[633,91],[511,279],[881,250],[864,813],[715,428],[252,38],[915,78],[871,577],[543,316],[280,247],[789,443],[876,20],[374,288],[813,413],[614,325],[829,542],[848,35],[836,242],[378,47],[653,102],[596,15],[204,166],[848,484],[463,146],[869,674],[974,219],[886,501],[877,160],[284,83],[960,799],[322,224],[950,461],[212,118],[331,319],[419,236],[130,5],[463,33],[747,350],[754,597],[409,318],[763,562],[529,13],[760,226],[981,800],[779,242],[464,13],[725,507],[478,291],[73,13],[589,412],[370,286],[589,178],[548,372],[956,129],[784,207],[54,26],[824,573],[695,105],[675,148],[776,171],[926,291],[608,203],[938,241],[415,230],[495,353],[871,575],[837,65],[831,266],[732,401],[984,804],[471,281],[733,179],[773,146],[967,428],[977,891],[453,316],[569,463],[521,365],[706,509],[410,53],[992,145],[834,478],[703,272],[288,12],[702,44],[678,49],[512,487],[963,845],[491,130],[588,524],[314,234],[278,166],[413,255],[728,21],[221,43],[342,149],[909,246],[851,802],[932,488],[535,475],[504,372],[763,349],[254,122],[845,217],[699,282],[736,52],[953,454],[842,728],[684,527],[455,148],[700,79],[643,212],[248,4],[270,183],[735,616],[877,558],[318,1],[392,193],[643,192],[789,233],[371,258],[699,614],[875,652],[599,590],[742,136],[861,775],[380,141],[266,205],[446,353],[946,417],[659,179],[444,342],[668,75],[954,306],[831,166],[976,961],[965,53],[359,51],[297,39],[857,334],[460,13],[624,523],[475,112],[739,356],[554,229],[171,75],[924,358],[568,34],[994,16],[123,46],[965,785],[608,452],[984,884],[457,291],[797,199],[935,236],[629,438],[737,118],[858,234],[825,556],[302,201],[255,226],[180,75],[961,169],[532,449],[264,10],[410,44],[404,117],[628,153],[953,256],[808,364],[826,143],[997,382],[975,900],[922,623],[486,220],[960,200],[504,13],[485,52],[799,25],[778,101],[913,688],[626,322],[123,103],[824,122],[716,240],[660,406],[804,401],[742,513],[651,649],[164,151],[859,146],[897,283],[916,52],[935,577],[615,93],[994,623],[234,151],[279,4],[88,22],[493,455],[982,134],[463,179],[160,146],[898,480],[599,291],[568,361],[892,209],[330,326],[808,236],[856,71],[625,10],[841,695],[791,480],[572,421],[679,220],[786,122],[587,68],[881,692],[698,268],[851,22],[784,269],[99,90],[490,37],[836,503],[753,125],[733,279],[893,388],[948,686],[579,271],[992,509],[340,161],[802,31],[742,297],[936,291],[559,7],[122,31],[728,279],[977,646],[751,701],[548,96],[17,0],[860,630],[860,531],[623,599],[715,456],[599,149],[991,476],[488,175],[845,11],[655,566],[810,588],[153,115],[989,533],[385,144],[857,45],[526,125],[335,121],[683,12],[746,677],[844,548],[726,373],[868,181],[870,780],[896,169],[762,337],[662,502],[731,125],[944,85],[850,665],[774,68],[830,90],[957,34],[784,458],[818,558],[642,191],[938,131],[443,370],[202,14],[430,371],[396,389],[818,150],[837,237],[918,206],[269,135],[622,5],[991,745],[173,123],[908,340],[918,517],[294,73],[741,453],[629,182],[540,507],[769,215],[437,0],[445,167],[838,689],[602,511],[861,64],[806,689],[903,68],[992,354],[984,173],[957,54],[925,426],[898,656],[372,268],[673,115],[202,119],[944,129],[930,504],[878,89],[908,533],[823,247],[735,64],[201,12],[751,488],[403,156],[213,183],[857,269],[593,350],[911,273],[838,369],[570,185],[369,36],[576,56],[982,602],[991,799],[374,77],[915,112],[868,82],[916,629],[977,627],[799,742],[695,210],[626,625],[688,120],[970,468],[893,738],[912,245],[478,52],[274,238],[580,514],[824,334],[936,563],[574,491],[332,293],[446,208],[635,481],[831,269],[810,674],[365,195],[770,730],[437,190],[446,157],[809,449],[720,190],[831,807],[340,216],[603,354],[912,443],[651,511],[731,684],[624,117],[908,187],[715,324],[605,160],[302,135],[941,176],[646,295],[988,407],[915,542],[654,384],[641,519],[515,340],[914,656],[954,109],[828,596],[260,211],[752,180],[924,416],[189,165],[790,304],[902,239],[432,259],[932,242],[685,453],[451,317],[629,467],[944,111],[683,440],[873,656],[214,56],[166,131],[208,11],[482,395],[626,293],[663,515],[244,243],[918,825],[947,487],[906,168],[768,625],[744,601],[778,285],[890,130],[390,271],[883,820],[240,121],[605,104],[455,446],[578,229],[924,850],[570,56],[965,846],[757,245],[963,646],[660,607],[949,585],[661,383],[609,171],[772,380],[836,507],[615,571],[980,895],[742,642],[528,5],[912,899],[330,186],[845,662],[965,471],[590,321],[334,62],[220,39],[918,421],[743,397],[890,487],[858,272],[813,549],[908,433],[774,560],[269,181],[388,202],[771,84],[822,453],[969,362],[714,484],[877,266],[786,763],[880,327],[804,115],[817,275],[280,133],[728,357],[769,314],[529,265],[698,306],[989,181],[494,9],[544,520],[712,665],[254,220],[326,154],[313,137],[820,406],[856,134],[140,96],[713,351],[226,41],[271,156],[978,564],[910,588],[716,245],[760,113],[673,545],[910,867],[296,239],[818,713],[973,657],[977,127],[867,727],[943,918],[421,342],[838,323],[222,44],[101,11],[125,38],[573,94],[992,991],[869,130],[838,569],[516,283],[838,252],[600,241],[265,9],[445,144],[542,64],[917,574],[528,355],[278,203],[641,575],[915,568],[833,541],[959,319],[986,946],[734,189],[750,40],[809,2],[854,836],[640,186],[755,266],[125,114],[730,150],[848,66],[238,114],[839,450],[820,399],[188,46],[367,249],[721,23],[427,106],[337,51],[622,220],[819,61],[235,105],[634,525],[707,690],[197,172],[400,301],[927,116],[181,78],[462,0],[635,568],[978,421],[967,405],[876,385],[489,222],[347,199],[965,490],[929,914],[596,325],[479,105],[861,716],[482,307],[221,219],[971,702],[179,153],[881,164],[650,315],[494,46],[637,486],[999,564],[930,134],[264,109],[673,588],[957,10],[887,297],[989,793],[626,328],[887,858],[820,277],[659,594],[887,248],[939,868],[993,601],[869,429],[786,143],[445,364],[661,523],[222,171],[695,160],[273,125],[938,478],[837,216],[230,36],[695,138],[967,928],[642,409],[559,456],[432,395],[435,414],[615,67],[841,792],[895,623],[814,708],[388,28],[634,226],[806,722],[872,667],[993,445],[209,67],[470,459],[814,381],[940,578],[519,19],[957,766],[268,144],[394,200],[975,891],[797,450],[771,54],[760,61],[822,420],[655,209],[656,647],[497,495],[768,179],[890,122],[686,259],[92,81],[614,414],[379,375],[602,435],[721,493],[508,423],[758,582],[548,112],[706,49],[499,458],[428,273],[907,865],[838,649],[393,211],[148,138],[936,871],[347,34],[996,639],[936,339],[978,902],[397,263],[817,669],[710,369],[568,226],[747,224],[667,9],[954,337],[979,835],[217,6],[333,156],[997,199],[575,57],[964,191],[969,288],[767,321],[477,94],[700,8],[452,300],[218,74],[656,128],[465,429],[586,216],[525,97],[665,30],[500,336],[450,106],[985,672],[993,54],[890,599],[600,2],[642,380],[809,450],[66,14],[224,81],[542,452],[963,133],[976,533],[686,569],[659,318],[499,214],[994,177],[566,66],[963,617],[417,395],[273,130],[942,201],[268,244],[898,182],[689,293],[919,549],[240,41],[596,379],[847,838],[561,309],[847,205],[245,86],[952,566],[358,257],[518,152],[283,184],[230,209],[816,600],[442,290],[980,262],[886,535],[280,217],[916,202],[458,388],[846,75],[395,86],[973,582],[695,243],[699,524],[361,176],[803,518],[121,38],[161,7],[890,194],[804,623],[674,404],[579,489],[619,40],[331,18],[700,389],[587,62],[823,261],[932,222],[937,128],[740,611],[315,273],[705,419],[760,238],[86,1],[573,375],[466,261],[808,31],[85,48],[839,175],[747,433],[381,98],[984,694],[486,229],[472,207],[800,691],[203,37],[576,88],[512,155],[926,820],[685,460],[871,3],[363,359],[815,151],[550,74],[647,623],[981,917],[376,59],[800,387],[416,302],[794,739],[461,210],[931,429],[601,598],[717,308],[812,415],[598,447],[623,132],[578,146],[669,668],[668,290],[812,618],[411,1],[723,98],[121,68],[762,184],[722,569],[908,815],[874,590],[712,615],[762,14],[948,940],[985,918],[459,31],[783,417],[393,61],[492,133],[852,476],[591,471],[124,39],[634,478],[659,65],[791,42],[993,424],[653,535],[978,953],[579,389],[421,289],[925,355],[787,367],[761,418],[980,2],[911,844],[515,375],[768,7],[690,641],[709,646],[516,455],[500,68],[191,109],[710,210],[375,51],[694,623],[980,507],[863,408],[840,103],[709,609],[962,772],[456,83],[333,301],[581,172],[742,166],[298,213],[452,37],[350,63],[198,157],[428,203],[131,16],[900,209],[962,836],[232,137],[815,342],[592,12],[546,11],[421,10],[346,45],[387,8],[556,7],[271,58],[435,410],[710,125],[925,558],[403,107],[161,76],[419,180],[433,126],[940,623],[420,251],[945,158],[562,356],[603,249],[535,457],[847,76],[607,62],[815,101],[852,368],[655,304],[728,385],[995,443],[982,257],[794,310],[261,45],[357,84],[685,270],[355,67],[523,11],[710,243],[662,473],[956,148],[712,330],[696,419],[928,640],[900,894],[767,762],[611,405],[645,33],[804,407],[801,585],[303,290],[837,96],[804,482],[236,138],[339,43],[280,150],[997,754],[904,552],[522,335],[748,456],[534,226],[806,759],[187,63],[783,265],[766,255],[300,8],[532,179],[895,578],[683,491],[943,654],[303,99],[993,750],[808,560],[852,784],[527,523],[578,536],[980,774],[396,18],[747,503],[523,238],[616,303],[984,47],[258,2],[770,24],[771,454],[936,558],[809,803],[715,602],[580,214],[385,152],[414,376],[979,808],[688,461],[640,584],[695,408],[37,6],[224,171],[316,7],[877,535],[884,67],[644,458],[890,562],[972,15],[358,152],[527,149],[427,221],[441,151],[760,581],[930,605],[910,822],[824,125],[418,16],[693,630],[330,75],[240,192],[924,11],[333,251],[772,59],[321,295],[804,91],[667,294],[803,241],[773,165],[618,184],[178,112],[550,89],[982,344],[527,197],[971,573],[413,127],[533,406],[546,189],[976,625],[846,516],[78,12],[581,542],[599,193],[331,58],[180,29],[738,548],[706,286],[695,499],[356,325],[496,391],[471,141],[416,60],[726,633],[339,187],[590,501],[490,89],[584,36],[898,749],[616,137],[838,586],[651,123],[622,96],[767,496],[949,794],[679,620],[782,436],[949,703],[56,21],[282,155],[588,138],[526,157],[982,967],[534,496],[868,575],[26,5],[915,119],[865,403],[949,677],[616,172],[342,160],[872,423],[723,30],[984,136],[440,243],[746,687],[990,783],[600,333],[979,690],[996,984],[639,125],[761,520],[241,207],[550,307],[784,688],[878,514],[97,42],[941,600],[449,235],[681,672],[919,781],[529,526],[478,234],[929,387],[734,351],[766,636],[944,844],[744,443],[434,315],[948,253],[870,73],[556,71],[787,255],[648,244],[662,301],[895,602],[675,367],[427,329],[560,320],[490,275],[643,596],[726,261],[924,67],[811,540],[938,716],[924,575],[925,188],[908,208],[414,132],[593,562],[607,535],[709,84],[983,58],[816,776],[791,737],[679,597],[995,478],[656,179],[746,93],[745,172],[656,489],[977,424],[469,405],[956,408],[968,484],[598,556],[754,386],[612,125],[610,288],[696,344],[287,161],[383,76],[526,360],[799,516],[635,268],[992,945],[695,23],[748,587],[900,66],[698,210],[533,167],[923,58],[886,738],[461,267],[408,95],[73,11],[989,405],[732,157],[325,112],[729,676],[861,325],[911,353],[28,23],[667,506],[718,410],[650,291],[966,872],[719,264],[989,167],[800,517],[121,106],[849,687],[807,637],[979,190],[295,294],[815,208],[385,158],[885,842],[889,56],[645,158],[213,117],[360,231],[779,126],[835,11],[820,57],[471,165],[805,586],[615,464],[877,814],[749,738],[503,368],[535,267],[979,516],[692,679],[736,247],[734,64],[618,96],[160,45],[375,111],[716,312],[718,290],[931,899],[251,160],[507,87],[601,452],[814,132],[708,90],[656,322],[949,227],[829,523],[637,201],[582,290],[702,663],[741,162],[97,84],[555,293],[539,286],[409,400],[726,532],[392,143],[174,35],[570,522],[478,279],[929,362],[418,211],[585,550],[771,326],[403,233],[330,14],[900,620],[833,76],[747,585],[108,9],[605,98],[939,68],[912,676],[955,674],[862,686],[614,448],[884,632],[631,130],[805,104],[970,34],[284,55],[669,330],[519,51],[114,36],[683,545],[834,451],[219,134],[615,239],[970,97],[736,621],[919,129],[528,345],[909,363],[629,154],[651,178],[573,113],[656,523],[581,390],[682,102],[613,393],[959,409],[991,888],[848,154],[636,469],[818,499],[706,251],[192,128],[676,375],[551,319],[975,344],[647,634],[893,34],[920,251],[821,797],[616,171],[999,941],[912,168],[877,765],[452,97],[742,718],[546,257],[47,28],[283,78],[147,51],[360,119],[759,514],[932,142],[312,54],[860,19],[389,165],[800,438],[806,534],[908,779],[500,430],[238,65],[523,99],[770,397],[951,532],[725,559],[996,861],[995,992],[576,13],[420,259],[806,436],[759,17],[464,89],[889,871],[919,177],[791,465],[716,392],[568,476],[679,471],[817,487],[753,151],[914,889],[940,376],[615,602],[584,151],[845,357],[863,31],[569,220],[772,527],[853,764],[776,457],[925,214],[908,71],[466,268],[867,106],[594,321],[420,337],[682,602],[549,517],[305,237],[915,474],[271,85],[511,309],[846,149],[788,510],[652,645],[880,704],[873,344],[529,527],[798,422],[895,200],[352,47],[281,84],[676,181],[949,720],[591,354],[966,418],[976,821],[807,291],[482,326],[457,275],[499,5],[519,328],[626,47],[737,380],[645,272],[377,262],[826,130],[476,19],[321,119],[382,375],[648,504],[804,654],[991,690],[381,190],[554,386],[386,264],[251,45],[478,414],[802,234],[558,122],[462,389],[156,116],[821,165],[905,2],[827,162],[870,31],[587,303],[428,110],[773,767],[831,261],[679,264],[510,15],[537,515],[850,54],[246,175],[869,7],[585,407],[865,436],[983,150],[544,6],[892,849],[773,674],[371,197],[974,295],[664,413],[893,870],[493,371],[900,143],[544,86],[589,230],[913,825],[725,161],[948,486],[718,667],[457,339],[743,566],[844,687],[721,307],[908,777],[168,26],[223,83],[641,80],[616,96],[902,608],[740,572],[589,539],[184,103],[871,762],[414,319],[502,113],[419,299],[872,333],[582,86],[392,307],[497,434],[416,334],[628,313],[886,597],[990,659],[436,225],[341,80],[540,93],[318,136],[956,464],[428,347],[964,567],[300,169],[613,575],[335,123],[998,517],[576,405],[727,57],[503,131],[431,173],[979,498],[921,222],[779,644],[409,366],[561,422],[704,183],[639,479],[412,403],[889,55],[907,3],[170,129],[927,338],[167,85],[646,370],[634,425],[835,675],[470,149],[902,142],[986,500],[833,819],[330,265],[490,447],[896,501],[735,512],[933,835],[693,506],[671,634],[641,231],[884,747],[600,154],[803,541],[557,153],[329,115],[774,606],[421,34],[892,707],[283,247],[248,7],[314,170],[721,278],[409,48],[864,619],[85,40],[897,487],[774,285],[636,315],[603,480],[828,209],[862,344],[453,135],[584,39],[652,521],[958,955],[332,65],[381,360],[618,243],[536,157],[869,139],[920,652],[319,241],[845,481],[863,573],[801,0],[330,311],[756,489],[824,223],[787,113],[948,479],[422,175],[218,17],[428,83],[963,273],[764,276],[278,22],[697,182],[640,136],[433,354],[727,40],[734,390],[269,93],[816,226],[589,431],[647,602],[636,101],[262,73],[395,211],[997,830],[810,379],[587,504],[748,215],[847,824],[806,648],[444,0],[766,536],[645,398],[249,53],[959,49],[646,34],[836,787],[891,586],[780,405],[784,133],[914,585],[981,122],[398,88],[870,429],[530,363],[709,608],[706,577],[926,557],[509,370],[745,719],[666,420],[688,141],[299,69],[766,305],[946,608],[946,446],[624,614],[704,527],[768,142],[998,33],[639,343],[332,284],[500,186],[39,6],[702,430],[981,620],[658,250],[887,579],[316,27],[938,432],[895,508],[357,121],[535,236],[138,54],[230,180],[692,231],[429,308],[958,841],[662,296],[828,793],[527,261],[929,515],[989,808],[750,337],[899,184],[608,433],[462,405],[415,30],[872,844],[503,92],[905,807],[457,140],[644,34],[669,263],[322,271],[698,488],[781,226],[634,255],[709,4],[271,132],[761,550],[893,11],[362,136],[663,219],[682,586],[775,142],[755,164],[882,242],[317,263],[436,242],[895,29],[833,686],[661,64],[306,141],[500,309],[399,0],[963,186],[83,80],[261,227],[550,467],[590,310],[434,340],[911,699],[158,88],[836,279],[338,264],[628,198],[908,624],[404,165],[604,465],[936,176],[942,233],[302,234],[212,77],[838,391],[890,875],[952,726],[781,280],[713,486],[414,182],[112,109],[563,406],[781,579],[520,492],[522,236],[433,62],[747,189],[863,445],[933,388],[896,393],[840,36],[732,588],[229,61],[431,281],[566,152],[635,284],[979,934],[797,521],[890,570],[810,76],[376,65],[890,158],[606,549],[328,150],[774,60],[603,284],[639,568],[628,625],[983,645],[403,128],[697,494],[839,577],[861,582],[258,58],[802,221],[769,659],[377,103],[993,912],[725,341],[759,137],[819,151],[671,60],[814,690],[935,424],[924,713],[990,584],[695,540],[875,479],[71,17],[934,502],[694,351],[843,454],[419,137],[992,122],[762,408],[962,487],[384,288],[701,655],[974,716],[755,277],[576,286],[579,197],[211,193],[291,114],[980,707],[192,65],[901,879],[986,679],[519,324],[927,914],[796,481],[585,197],[387,260],[148,37],[810,792],[636,333],[826,774],[523,342],[728,411],[851,712],[699,540],[914,766],[620,109],[848,677],[820,726],[649,227],[712,675],[394,243],[742,606],[262,171],[687,371],[766,434],[519,322],[601,198],[825,800],[831,532],[613,117],[118,25],[390,380],[655,348],[734,598],[492,322],[581,391],[576,308],[358,169],[804,590],[465,213],[783,697],[324,60],[926,131],[550,87],[757,384],[746,88],[969,510],[577,196],[603,398],[459,54],[273,88],[529,194],[931,323],[962,431],[564,529],[780,431],[822,720],[390,261],[910,883],[363,13],[941,286],[816,64],[172,68],[612,37],[157,39],[601,146],[532,198],[977,927],[467,328],[633,200],[802,146],[984,230],[972,151],[536,58],[229,177],[704,27],[260,117],[332,107],[935,144],[514,339],[197,14],[687,484],[590,38],[853,598],[898,510],[979,24],[992,243],[801,464],[706,631],[495,186],[406,184],[869,581],[689,242],[369,45],[830,767],[359,92],[454,118],[809,510],[543,393],[520,207],[201,150],[666,319],[902,88],[893,479],[571,460],[659,535],[752,678],[910,277],[311,15],[776,691],[691,423],[579,54],[207,42],[888,735],[901,49],[854,428],[765,393],[481,126],[860,69],[968,106],[899,514],[319,247],[939,366],[479,297],[988,876],[347,62],[799,97],[892,169],[395,345],[630,85],[508,447],[552,280],[353,329],[823,630],[939,513],[966,453],[672,255],[979,881],[326,216],[998,787],[919,228],[447,361],[735,145],[534,528],[568,203],[417,282],[782,563],[962,42],[552,29],[747,542],[854,302],[799,22],[713,457],[608,359],[867,337],[738,547],[572,290],[544,397],[435,352],[497,207],[449,448],[814,49],[709,589],[821,655],[769,709],[809,651],[789,533],[737,588],[484,227],[967,617],[916,32],[954,286],[809,274],[925,880],[954,933],[455,72],[862,600],[364,160],[983,258],[752,716],[616,281],[766,172],[559,85],[335,270],[671,415],[751,461],[614,502],[822,503],[592,480],[863,132],[653,37],[969,231],[846,356],[720,70],[802,247],[290,93],[275,33],[558,481],[902,516],[531,494],[299,135],[188,184],[978,631],[823,117],[907,701],[850,218],[715,235],[822,17],[504,397],[802,441],[159,130],[318,314],[724,91],[883,5],[959,411],[385,230],[991,623],[789,439],[533,319],[694,469],[410,37],[469,441],[238,226],[961,564],[543,83],[633,520],[911,788],[710,273],[867,557],[741,128],[588,561],[553,170],[362,337],[560,140],[653,313],[552,387],[215,25],[326,18],[338,90],[678,649],[706,661],[323,239],[767,309],[433,208],[827,72],[737,246],[924,48],[744,143],[601,274],[175,74],[701,569],[425,401],[604,44],[793,371],[465,364],[507,121],[752,511],[453,345],[86,41],[870,81],[900,96],[612,177],[852,398],[505,95],[799,327],[769,170],[849,368],[705,582],[597,328],[529,113],[928,745],[838,563],[474,394],[173,48],[619,321],[873,588],[906,403],[869,588],[699,30],[655,449],[263,140],[311,197],[788,553],[903,704],[916,159],[262,128],[925,395],[758,92],[642,159],[900,771],[871,178],[950,367],[960,559],[157,149],[641,279],[671,465],[727,130],[779,444],[236,119],[401,65],[876,413],[369,142],[593,499],[920,875],[389,159],[696,616],[488,295],[632,225],[948,614],[972,867],[871,678],[226,84],[810,359],[806,508],[935,61],[958,449],[890,558],[145,130],[613,320],[997,986],[746,308],[837,67],[74,40],[842,170],[873,735],[786,126],[253,218],[436,155],[956,865],[866,671],[960,453],[736,378],[593,194],[852,552],[766,680],[430,33],[834,329],[629,536],[319,268],[630,256],[958,422],[561,190],[984,341],[738,314],[728,458],[933,66],[718,161],[644,40],[821,625],[615,156],[525,49],[793,262],[823,436],[525,148],[692,453],[973,617],[398,386],[693,670],[477,377],[998,11],[946,166],[602,142],[911,270],[905,318],[391,98],[355,180],[955,162],[540,513],[360,228],[277,211],[645,84],[760,562],[551,133],[302,111],[912,806],[967,531],[899,746],[858,756],[224,120],[651,635],[449,280],[654,643],[680,123],[789,549],[943,76],[503,350],[913,661],[695,462],[963,513],[457,321],[817,375],[761,19],[920,404],[946,108],[797,26],[357,285],[622,331],[503,340],[921,36],[884,440],[105,102],[683,465],[773,492],[765,301],[751,608],[275,225],[510,123],[501,214],[977,802],[677,534],[961,760],[942,938],[774,710],[355,115],[159,6],[950,573],[214,190],[722,702],[480,228],[909,10],[701,469],[529,455],[982,746],[760,375],[810,391],[778,92],[963,908],[630,56],[686,171],[553,477],[390,229],[696,424],[726,151],[934,465],[797,781],[557,242],[772,180],[876,355],[607,451],[186,133],[726,240],[825,715],[236,164],[826,711],[990,608],[957,332],[616,284],[761,566],[861,519],[355,38],[773,391],[806,346],[243,167],[311,295],[643,273],[583,509],[884,673],[509,408],[543,162],[693,92],[974,847],[909,51],[215,91],[733,477],[939,630],[800,321],[933,877],[765,745],[268,246],[766,329],[595,360],[581,512],[688,507],[734,450],[721,642],[798,676],[171,157],[158,85],[551,5],[763,602],[659,548],[701,652],[579,470],[771,609],[921,789],[680,62],[459,42],[734,625],[219,80],[338,247],[671,368],[868,189],[802,741],[938,882],[640,277],[956,920],[369,0],[913,171],[726,359],[728,566],[681,326],[481,243],[757,19],[252,80],[992,663],[89,21],[449,224],[847,224],[532,280],[406,39],[711,233],[693,497],[694,233],[664,101],[667,27],[403,204],[546,133],[468,184],[755,89],[730,305],[609,362],[885,290],[928,766],[182,20],[387,381],[385,27],[645,614],[720,458],[581,489],[975,154],[395,388],[449,258],[743,717],[116,19],[533,81],[408,205],[492,270],[788,316],[717,571],[123,74],[903,569],[659,476],[909,18],[853,153],[970,882],[728,262],[724,255],[593,235],[797,275],[799,703],[879,387],[788,358],[350,68],[669,184],[829,117],[787,705],[559,244],[209,24],[935,566],[930,341],[627,256],[568,93],[296,191],[795,349],[670,396],[587,429],[929,202],[645,508],[820,581],[793,789],[640,370],[781,591],[801,556],[886,17],[548,31],[647,130],[186,68],[593,283],[577,286],[856,582],[337,126],[755,21],[925,571],[868,330],[408,114],[502,183],[219,64],[157,62],[909,184],[326,108],[239,86],[919,743],[628,20],[720,149],[503,168],[702,233],[889,859],[558,164],[692,504],[786,727],[951,217],[960,119],[171,98],[680,467],[996,91],[947,898],[616,16],[513,353],[985,826],[975,223],[757,52],[781,267],[858,397],[883,21],[312,170],[869,679],[581,350],[353,136],[755,461],[617,33],[710,232],[273,178],[746,130],[912,828],[77,6],[900,853],[711,328],[835,423],[676,367],[619,440],[510,477],[355,25],[887,246],[887,163],[563,353],[841,16],[717,9],[353,7],[504,446],[764,710],[423,19],[444,79],[584,70],[679,512],[955,251],[837,463],[880,26],[652,587],[909,308],[126,73],[73,50],[533,446],[494,21],[893,512],[889,809],[598,564],[718,699],[903,26],[998,143],[972,894],[446,129],[585,533],[652,407],[457,65],[277,47],[203,40],[512,491],[829,282],[614,561],[933,780],[385,79],[636,148],[869,662],[528,412],[888,44],[887,282],[887,172],[639,231],[392,21],[916,237],[536,82],[492,176],[970,885],[470,157],[793,274],[651,368],[865,784],[863,616],[887,323],[697,240],[981,612],[927,15],[574,534],[694,216],[305,209],[783,27],[676,444],[975,94],[432,422],[789,10],[694,343],[777,470],[816,365],[638,8],[931,365],[465,413],[373,363],[953,243],[461,214],[955,560],[179,141],[969,742],[528,156],[737,367],[615,223],[417,328],[959,941],[860,488],[765,469],[301,10],[243,128],[463,20],[765,45],[814,124],[663,167],[936,609],[984,872],[997,650],[869,474],[927,409],[820,414],[321,14],[787,13],[850,197],[189,45],[896,386],[957,5],[743,230],[617,458],[622,605],[658,355],[356,326],[268,31],[717,584],[202,191],[942,266],[649,398],[264,83],[830,689],[702,245],[449,343],[984,3],[817,641],[889,655],[353,52],[538,520],[708,298],[323,118],[427,146],[569,395],[541,509],[642,26],[657,77],[563,262],[624,518],[519,46],[971,12],[646,174],[838,786],[985,486],[837,256],[413,81],[107,6],[766,406],[337,172],[96,28],[524,44],[49,16],[940,57],[864,734],[966,270],[737,386],[505,318],[726,223],[563,186],[526,99],[605,20],[610,187],[613,67],[626,133],[702,275],[713,192],[700,426],[988,719],[290,24],[356,253],[950,727],[664,174],[767,440],[815,259],[727,53],[861,243],[309,123],[638,279],[834,632],[940,543],[631,28],[770,458],[311,205],[880,215],[764,616],[651,382],[331,327],[905,847],[911,60],[282,260],[904,527],[712,381],[112,37],[133,123],[723,350],[918,227],[628,474],[736,605],[173,0],[884,300],[531,151],[725,225],[998,163],[531,279],[940,886],[533,177],[177,28],[893,456],[969,953],[656,276],[577,60],[221,159],[951,536],[746,615],[671,66],[935,117],[318,96],[712,38],[316,65],[757,155],[763,276],[143,28],[976,431],[749,700],[793,674],[673,78],[870,867],[818,481],[966,162],[570,527],[363,178],[887,536],[647,355],[659,342],[308,241],[529,105],[344,246],[555,433],[798,555],[170,18],[814,347],[465,21],[965,450],[906,183],[976,420],[649,272],[907,587],[840,229],[357,120],[500,306],[689,509],[904,513],[998,335],[843,243],[874,721],[219,20],[792,282],[975,626],[338,311],[826,637],[768,549],[955,571],[996,548],[963,450],[986,736],[975,448],[462,36],[650,194],[782,679],[651,426],[784,539],[656,302],[306,219],[778,488],[899,435],[743,553],[807,204],[568,509],[797,508],[598,435],[284,176],[819,699],[937,757],[336,46],[635,448],[322,29],[374,37],[583,225],[939,641],[283,154],[942,92],[933,858],[770,240],[203,189],[711,605],[726,661],[275,239],[816,337],[914,757],[343,248],[533,34],[888,428],[542,232],[914,161],[283,145],[834,455],[778,731],[918,120],[374,220],[555,158],[935,32],[826,241],[461,97],[903,132],[945,204],[725,51],[279,189],[389,309],[489,121],[560,502],[755,235],[552,33],[850,558],[988,365],[831,256],[381,178],[502,436],[564,272],[918,892],[960,785],[366,38],[922,849],[855,265],[752,485],[861,709],[977,323],[880,458],[637,71],[500,414],[613,522],[115,21],[717,565],[672,399],[877,386],[858,11],[791,561],[756,516],[925,583],[576,325],[825,274],[505,353],[918,140],[964,853],[398,104],[696,301],[866,688],[890,465],[576,28],[625,88],[949,717],[200,41],[767,548],[844,383],[857,591],[840,759],[829,81],[832,622],[848,29],[856,208],[609,42],[428,399],[977,174],[821,261],[931,568],[345,219],[950,808],[553,136],[925,622],[509,397],[802,621],[929,320],[816,445],[727,418],[814,684],[650,595],[589,408],[210,126],[458,289],[997,500],[324,318],[253,78],[665,165],[950,574],[592,454],[683,140],[440,266],[998,133],[502,132],[790,542],[804,676],[96,93],[562,178],[683,33],[682,663],[173,61],[536,186],[547,212],[589,125],[831,449],[621,323],[688,591],[954,299],[672,54],[538,150],[624,484],[872,737],[819,371],[498,36],[494,122],[868,186],[280,183],[949,900],[714,379],[273,171],[333,127],[737,613],[598,4],[476,463],[710,597],[670,516],[933,420],[771,736],[873,452],[656,80],[702,694],[888,33],[178,136],[928,763],[525,310],[767,707],[564,229],[912,111],[856,242],[663,163],[943,509],[257,121],[106,14],[752,105],[678,501],[355,343],[984,336],[232,2],[968,845],[547,235],[706,77],[447,155],[923,848],[558,72],[711,307],[682,648],[916,396],[903,370],[817,211],[934,273],[933,338],[640,348],[27,0],[729,152],[960,678],[671,237],[693,491],[542,463],[977,806],[944,315],[46,1],[712,326],[548,176],[513,423],[748,660],[289,85],[394,41],[216,137],[859,597],[848,696],[577,465],[846,231],[710,533],[930,518],[191,52],[430,334],[427,226],[946,287],[702,473],[850,246],[875,821],[892,416],[191,142],[875,405],[165,44],[973,767],[600,308],[815,158],[616,333],[870,522],[991,678],[331,190],[503,196],[743,430],[911,492],[940,884],[370,217],[327,17],[687,57],[173,169],[895,697],[649,282],[840,357],[905,326],[623,515],[976,702],[420,46],[897,492],[839,165],[197,25],[908,27],[658,596],[131,40],[680,650],[489,486],[771,767],[693,490],[457,69],[790,334],[663,95],[512,136],[483,312],[548,62],[623,1],[820,818],[972,428],[455,52],[930,206],[794,94],[373,299],[950,705],[372,84],[676,542],[563,559],[684,314],[924,742],[373,285],[736,190],[809,265],[786,33],[579,65],[433,23],[750,259],[451,260],[767,39],[969,259],[867,227],[942,32],[934,846],[900,134],[635,258],[570,503],[516,415],[812,479],[693,145],[502,498],[873,577],[594,468],[626,434],[517,75],[356,111],[908,337],[997,29],[112,99],[846,759],[931,445],[153,48],[987,184],[944,318],[856,249],[219,85],[836,83],[108,73],[760,598],[729,529],[367,170],[860,21],[286,283],[919,841],[804,157],[598,327],[294,97],[636,372],[477,437],[478,316],[966,149],[283,258],[672,669],[599,286],[448,251],[725,525],[760,101],[891,481],[433,97],[686,163],[161,149],[664,593],[703,89],[846,429],[839,569],[709,181],[754,317],[679,538],[954,731],[778,200],[693,268],[324,91],[320,307],[487,67],[540,450],[664,486],[599,340],[511,51],[920,534],[629,480],[875,192],[910,271],[957,95],[401,383],[816,634],[861,597],[730,567],[965,753],[958,114],[802,723],[744,268],[562,336],[404,254],[916,452],[738,288],[806,348],[640,110],[612,366],[534,182],[301,49],[715,290],[964,844],[356,16],[334,136],[921,184],[963,701],[675,405],[907,514],[356,89],[945,458],[996,132],[996,48],[814,172],[549,137],[877,324],[632,131],[814,47],[994,743],[917,616],[518,417],[822,398],[578,452],[719,481],[795,256],[196,53],[774,549],[903,385],[395,254],[937,151],[990,848],[896,865],[513,103],[813,213],[522,91],[366,163],[354,199],[965,384],[805,70],[369,16],[302,105],[570,137],[913,420],[748,606],[853,50],[749,177],[547,320],[760,529],[300,213],[562,289],[932,613],[372,281],[927,22],[680,428],[111,50],[667,50],[637,371],[687,423],[725,630],[386,384],[588,45],[889,573],[569,387],[393,258],[943,377],[400,133],[243,129],[576,317],[768,312],[231,83],[731,723],[744,509],[435,35],[429,385],[489,114],[538,362],[888,319],[819,100],[391,308],[388,21],[911,104],[770,716],[712,490],[690,486],[171,110],[981,527],[697,148],[767,123],[858,523],[638,425],[962,958],[594,470],[876,69],[851,690],[415,12],[164,66],[845,308],[341,233],[370,156],[986,437],[849,470],[541,9],[936,897],[978,388],[843,756],[772,674],[418,316],[589,100],[479,183],[918,267],[857,254],[695,532],[974,287],[628,594],[752,301],[219,25],[316,181],[355,125],[283,204],[565,210],[295,123],[174,45],[196,47],[990,456],[267,164],[805,790],[587,347],[915,810],[356,355],[247,225],[864,860],[879,345],[820,776],[690,309],[565,179],[968,908],[989,351],[460,353],[470,320],[959,899],[514,443],[506,492],[945,449],[904,13],[619,173],[352,33],[705,190],[575,307],[931,44],[920,463],[628,580],[506,293],[993,102],[853,749],[403,270],[812,385],[394,101],[769,2],[925,207],[980,831],[800,344],[824,199],[682,655],[773,639],[387,337],[726,192],[471,29],[887,778],[908,496],[244,91],[237,99],[909,603],[450,440],[816,481],[287,281],[677,59],[442,292],[930,534],[519,348],[644,272],[779,110],[890,54],[736,364],[677,661],[401,356],[487,409],[493,415],[230,75],[984,316],[819,623],[503,429],[167,48],[952,938],[843,511],[703,64],[292,64],[881,638],[782,341],[693,522],[533,157],[790,696],[508,491],[886,144],[995,253],[766,646],[996,62],[466,455],[388,81],[846,30],[869,481],[714,253],[657,280],[842,326],[779,80],[723,532],[472,172],[834,497],[436,32],[617,353],[667,322],[788,145],[303,76],[893,745],[452,287],[893,260],[474,274],[659,453],[953,733],[658,377],[331,93],[597,293],[773,373],[489,42],[922,245],[850,596],[487,27],[817,22],[786,1],[888,406],[878,810],[960,45],[129,40],[386,281],[978,823],[100,52],[771,370],[779,747],[952,491],[290,215],[690,272],[955,283],[740,377],[465,370],[428,375],[692,208],[381,293],[825,91],[57,55],[303,102],[348,316],[988,418],[253,243],[618,74],[719,490],[491,147],[776,724],[680,492],[889,569],[798,322],[618,344],[824,755],[818,56],[779,52],[982,586],[807,194],[212,189],[869,852],[890,242],[739,118],[788,520],[696,637],[676,32],[834,378],[620,486],[733,656],[869,38],[657,145],[448,41],[302,251],[903,768],[416,91],[525,431],[338,83],[525,523],[798,386],[651,590],[475,191],[788,776],[496,385],[216,5],[728,159],[687,168],[892,548],[753,473],[371,241],[981,633],[500,257],[733,295],[381,94],[618,430],[449,46],[860,43],[745,728],[981,59],[833,612],[428,12],[319,151],[437,152],[919,425],[137,15],[750,176],[237,203],[830,79],[765,41],[305,138],[477,87],[678,669],[815,528],[988,571],[799,357],[693,181],[511,294],[588,172],[901,460],[705,586],[749,679],[951,745],[813,289],[349,74],[804,533],[909,409],[910,129],[846,355],[381,312],[917,54],[915,202],[502,367],[735,324],[676,167],[943,630],[881,721],[918,884],[912,178],[928,34],[938,845],[810,101],[730,206],[756,16],[911,247],[275,220],[876,554],[927,328],[673,387],[919,55],[570,272],[902,853],[469,452],[883,530],[577,187],[596,97],[798,776],[991,828],[851,179],[763,502],[943,552],[672,150],[248,108],[599,460],[858,313],[774,193],[979,193],[373,233],[469,275],[698,94],[827,184],[781,132],[784,734],[54,41],[826,597],[739,57],[956,768],[954,423],[424,219],[511,45],[845,152],[119,46],[932,313],[929,644],[795,717],[795,245],[926,686],[290,75],[842,663],[870,699],[296,118],[961,6],[528,425],[804,546],[559,336],[715,207],[874,846],[922,609],[931,104],[705,440],[979,437],[287,224],[822,205],[367,58],[695,5],[889,485],[912,466],[885,399],[837,64],[734,402],[932,860],[974,451],[587,501],[476,408],[808,471],[915,545],[901,857],[863,518],[438,430],[380,13],[446,201],[630,306],[792,603],[811,395],[109,93],[882,158],[607,596],[573,348],[779,272],[793,241],[885,588],[874,207],[439,424],[821,732],[969,588],[777,66],[925,827],[694,522],[908,333],[685,432],[567,461],[945,512],[747,365],[395,207],[368,321],[957,597],[417,250],[440,17],[548,531],[176,141],[687,68],[869,46],[856,678],[913,904],[303,276],[347,310],[845,712],[851,708],[688,296],[996,623],[968,921],[321,266],[982,487],[266,44],[739,293],[594,223],[946,550],[209,64],[432,283],[843,136],[797,480],[917,630],[986,323],[383,103],[298,247],[881,37],[811,255],[185,110],[810,772],[754,644],[727,242],[822,461],[444,44],[903,536],[240,87],[898,496],[978,771],[628,397],[751,120],[816,688],[629,434],[794,101],[911,726],[628,360],[749,195],[246,206],[424,333],[503,495],[652,394],[119,98],[538,97],[703,390],[914,266],[432,320],[984,865],[594,235],[362,110],[841,178],[802,271],[275,195],[695,473],[764,5],[801,352],[745,518],[921,801],[386,182],[691,531],[805,241],[698,331],[285,261],[971,440],[304,138],[895,201],[489,50],[719,91],[419,314],[714,361],[425,64],[954,7],[870,40],[795,462],[329,232],[811,523],[912,667],[709,206],[917,538],[613,14],[849,114],[104,98],[235,115],[454,308],[496,166],[572,106],[944,784],[364,181],[468,198],[845,18],[986,562],[722,270],[988,603],[431,110],[539,229],[508,349],[820,453],[768,368],[409,131],[953,320],[809,101],[795,76],[515,280],[694,579],[378,34],[504,488],[785,776],[994,546],[822,268],[948,815],[784,776],[218,19],[898,531],[240,0],[786,708],[405,54],[926,498],[465,81],[608,276],[247,150],[881,491],[871,187],[597,416],[865,745],[861,807],[909,556],[359,138],[451,112],[381,158],[773,487],[753,745],[746,2],[496,450],[780,171],[885,500],[379,23],[328,230],[730,247],[900,496],[657,581],[915,292],[732,114],[653,584],[798,466],[568,121],[869,27],[491,306],[879,242],[970,658],[558,514],[761,335],[681,335],[869,391],[885,814],[593,315],[691,116],[798,67],[413,372],[537,352],[654,571],[673,345],[908,517],[745,75],[603,54],[96,60],[760,191],[250,209],[464,42],[595,323],[518,220],[923,631],[858,357],[734,469],[424,246],[509,254],[881,866],[266,158],[164,111],[85,55],[508,502],[928,352],[214,1],[614,195],[231,21],[395,18],[880,702],[888,612],[759,486],[529,480],[824,589],[540,265],[695,690],[907,153],[658,583],[770,73],[244,123],[989,701],[915,512],[692,148],[625,572],[541,492],[847,201],[934,933],[474,27],[659,322],[735,418],[833,195],[385,328],[645,351],[566,180],[310,18],[832,590],[807,652],[726,313],[853,148],[68,25],[732,147],[895,509],[310,147],[192,92],[372,15],[978,692],[857,656],[865,172],[246,225],[165,122],[913,97],[409,8],[520,491],[894,820],[825,128],[534,183],[792,151],[883,692],[461,263],[909,179],[44,4],[938,146],[964,955],[108,53],[617,400],[414,277],[925,343],[895,436],[156,95],[525,359],[489,23],[170,103],[422,325],[755,406],[540,376],[793,342],[403,272],[640,69],[881,317],[262,110],[600,434],[331,166],[950,775],[818,247],[392,350],[907,261],[721,614],[909,752],[841,481],[269,155],[366,119],[257,241],[897,780],[421,42],[332,201],[972,234],[644,57],[829,744],[962,576],[901,877],[218,62],[927,29],[294,209],[488,395],[865,148],[690,361],[552,533],[816,241],[934,210],[668,42],[650,371],[350,343],[914,621],[640,521],[922,268],[559,434],[948,659],[544,439],[884,466],[941,921],[640,280],[923,4],[870,472],[282,13],[428,54],[869,846],[497,104],[901,832],[510,208],[643,105],[584,347],[905,162],[140,80],[417,161],[655,571],[903,845],[853,805],[324,236],[848,464],[888,79],[830,798],[337,284],[931,784],[921,893],[805,454],[521,41],[527,262],[587,9],[748,206],[624,600],[272,122],[490,381],[674,477],[684,288],[686,51],[692,243],[984,222],[218,82],[297,122],[991,973],[413,281],[581,536],[845,290],[728,96],[704,37],[632,189],[639,182],[443,389],[680,151],[905,593],[824,631],[359,46],[709,501],[857,22],[682,192],[945,403],[940,796],[347,226],[759,384],[322,111],[993,146],[950,369],[683,439],[581,442],[405,63],[581,376],[436,45],[470,177],[719,319],[732,673],[687,585],[967,440],[848,615],[752,300],[177,140],[907,746],[365,353],[517,370],[405,243],[941,269],[712,404],[456,329],[751,285],[546,329],[860,123],[365,72],[735,510],[876,537],[902,869],[546,545],[261,166],[733,247],[498,359],[784,361],[602,505],[971,846],[770,99],[869,527],[842,615],[975,652],[182,145],[840,10],[845,779],[897,141],[915,779],[635,406],[736,503],[540,99],[771,44],[674,338],[763,742],[676,484],[429,189],[667,591],[863,150],[836,268],[754,90],[474,378],[831,604],[577,526],[874,93],[707,150],[399,335],[948,330],[913,848],[789,227],[273,200],[259,167],[706,420],[656,490],[135,90],[319,291],[835,538],[781,737],[300,233],[940,76],[438,98],[431,251],[794,72],[615,57],[781,328],[565,69],[774,577],[317,93],[294,163],[699,164],[793,379],[947,319],[982,40],[910,582],[770,444],[559,75],[872,404],[836,315],[733,390],[704,514],[456,453],[924,647],[325,152],[770,158],[645,431],[254,108],[500,292],[773,458],[763,466],[934,76],[890,684],[330,243],[695,378],[595,543],[879,94],[823,204],[711,267],[675,327],[437,368],[504,88],[645,226],[890,685],[843,470],[943,422],[846,57],[835,746],[739,425],[211,30],[476,440],[320,3],[691,601],[866,216],[877,596],[709,249],[619,163],[729,274],[44,37],[474,425],[323,322],[388,186],[420,279],[408,120],[779,480],[843,595],[557,345],[703,645],[345,121],[618,223],[741,104],[328,46],[421,177],[819,421],[655,535],[619,380],[775,249],[145,26],[748,345],[535,290],[603,466],[814,295],[863,260],[83,34],[767,14],[324,210],[674,509],[447,37],[606,336],[467,349],[323,312],[542,535],[467,445],[853,114],[920,511],[537,465],[848,388],[764,44],[420,382],[729,562],[525,154],[341,197],[470,456],[794,305],[546,7],[517,478],[228,69],[631,85],[763,715],[810,75],[856,7],[340,141],[859,210],[633,53],[494,429],[179,0],[841,144],[891,792],[970,962],[837,436],[700,467],[692,85],[948,375],[994,253],[775,409],[720,543],[843,545],[710,689],[194,157],[907,231],[440,39],[831,697],[433,247],[923,408],[785,55],[756,660],[820,431],[650,281],[907,517],[883,515],[613,436],[716,29],[828,515],[462,272],[492,412],[660,73],[446,442],[721,185],[990,736],[963,255],[811,526],[935,845],[803,354],[613,110],[643,496],[734,726],[606,13],[743,668],[301,190],[854,732],[763,528],[530,468],[664,332],[972,643],[911,300],[377,64],[693,460],[999,263],[932,16],[867,207],[980,896],[816,44],[238,61],[434,56],[759,357],[761,259],[687,181],[846,482],[304,95],[79,3],[497,391],[810,358],[542,126],[980,464],[440,369],[872,538],[958,246],[730,519],[878,146],[760,76],[941,651],[460,184],[921,838],[907,506],[955,56],[440,114],[908,512],[761,134],[650,56],[616,380],[782,49],[678,312],[847,457],[890,706],[394,22],[880,713],[459,132],[866,67],[462,17],[753,532],[965,729],[994,918],[110,98],[886,97],[973,492],[336,57],[893,703],[844,741],[627,311],[863,443],[956,833],[432,345],[450,276],[751,127],[886,28],[846,67],[631,199],[559,335],[699,280],[710,76],[860,293],[836,354],[975,654],[944,311],[526,307],[754,541],[836,327],[893,836],[710,47],[313,28],[632,486],[902,852],[987,354],[929,848],[817,125],[295,188],[531,194],[797,302],[302,209],[919,762],[628,548],[263,114],[755,85],[826,267],[858,691],[783,672],[239,113],[635,222],[896,893],[188,111],[538,452],[453,284],[689,671],[747,121],[668,647],[947,613],[978,289],[701,53],[817,225],[893,16],[785,84],[737,559],[660,234],[654,578],[649,606],[228,129],[444,133],[883,376],[924,922],[946,912],[966,928],[641,333],[854,731],[683,311],[192,167],[691,662],[307,80],[760,669],[476,263],[389,193],[747,450],[517,444],[881,475],[861,172],[988,283],[170,3],[806,797],[880,223],[614,187],[584,448],[989,350],[876,388],[817,328],[743,210],[847,0],[362,226],[603,248],[647,542],[239,38],[781,650],[341,263],[772,210],[707,135],[744,717],[838,491],[972,590],[537,109],[516,287],[227,209],[773,511],[594,8],[913,319],[809,703],[916,410],[279,45],[212,20],[376,177],[605,494],[782,644],[809,65],[268,11],[549,88],[677,594],[255,138],[906,892],[962,652],[857,535],[452,122],[595,592],[998,306],[969,432],[762,570],[793,448],[725,293],[809,670],[792,296],[632,22],[789,335],[778,182],[856,228],[737,411],[771,233],[963,509],[466,366],[737,184],[520,455],[965,816],[589,345],[790,339],[627,173],[886,846],[822,13],[724,349],[345,83],[554,184],[808,718],[430,135],[744,517],[646,78],[792,136],[944,690],[786,555],[949,698],[690,391],[924,535],[942,318],[802,331],[898,144],[749,640],[541,359],[440,338],[923,643],[307,7],[851,609],[940,625],[573,448],[364,310],[398,62],[237,107],[670,483],[891,668],[420,88],[422,286],[997,442],[831,660],[952,822],[694,394],[752,641],[776,239],[405,139],[490,104],[775,432],[699,637],[691,323],[535,64],[287,60],[242,193],[788,274],[879,492],[787,228],[779,681],[785,642],[426,200],[939,8],[412,94],[928,196],[837,439],[692,177],[893,644],[681,380],[425,37],[442,412],[992,535],[501,89],[874,657],[362,81],[995,841],[854,566],[209,18],[954,225],[824,723],[724,303],[634,604],[917,66],[754,497],[610,9],[307,11],[649,175],[891,835],[747,301],[446,221],[767,343],[206,156],[571,82],[441,181],[217,129],[958,658],[702,413],[780,558],[563,386],[689,666],[353,289],[923,635],[568,391],[529,476],[912,659],[983,427],[977,421],[856,837],[479,176],[852,514],[813,267],[397,368],[621,545],[567,199],[358,193],[910,245],[445,52],[875,676],[937,372],[470,190],[798,503],[540,283],[288,50],[849,85],[938,912],[486,111],[729,683],[610,156],[739,206],[467,336],[731,61],[938,831],[656,644],[889,556],[711,572],[914,853],[398,45],[989,616],[985,430],[424,274],[588,151],[600,46],[312,200],[857,682],[257,94],[849,793],[555,523],[949,659],[998,802],[703,145],[810,732],[697,456],[482,213],[832,159],[854,91],[357,133],[972,247],[803,687],[763,284],[887,154],[750,51],[496,348],[195,183],[974,151],[827,825],[933,878],[866,5],[766,501],[713,159],[385,205],[873,293],[781,175],[998,864],[593,181],[444,435],[904,618],[887,252],[531,33],[854,386],[267,47],[336,333],[946,144],[944,173],[315,213],[334,326],[779,752],[412,322],[773,398],[817,180],[236,92],[779,96],[672,20],[337,256],[460,70],[659,611],[960,479],[363,308],[686,243],[899,86],[196,93],[976,959],[358,333],[819,647],[855,765],[323,11],[649,611],[484,316],[514,383],[797,692],[859,101],[562,2],[792,458],[873,684],[946,484],[752,252],[926,364],[556,535],[611,284],[991,987],[498,134],[803,767],[606,84],[801,344],[891,875],[749,551],[609,397],[168,79],[720,14],[490,7],[658,83],[736,232],[481,127],[978,403],[694,262],[821,327],[637,304],[762,114],[776,499],[767,21],[508,367],[812,524],[896,753],[661,460],[697,359],[958,150],[767,591],[436,257],[700,602],[526,288],[693,560],[884,39],[398,34],[455,384],[805,569],[160,142],[515,407],[557,285],[941,532],[644,152],[521,134],[784,696],[424,3],[484,106],[540,263],[888,365],[891,700],[822,764],[764,434],[617,347],[462,136],[609,373],[722,406],[644,578],[867,228],[551,399],[791,452],[712,391],[558,183],[993,34],[894,671],[597,395],[949,836],[589,194],[855,53],[783,56],[929,288],[848,717],[607,436],[587,45],[706,124],[912,691],[921,748],[857,805],[609,465],[683,1],[881,684],[231,161],[874,833],[794,429],[917,155],[928,894],[485,303],[996,714],[426,265],[872,209],[380,169],[876,858],[908,266],[789,452],[181,30],[399,207],[695,80],[722,404],[58,18],[863,439],[586,233],[948,393],[846,590],[776,563],[445,70],[885,301],[912,517],[671,31],[622,357],[762,534],[726,566],[661,380],[809,169],[367,183],[256,192],[789,544],[649,433],[370,186],[588,339],[671,549],[549,244],[710,259],[945,367],[543,391],[898,508],[712,248],[486,467],[512,508],[824,436],[637,178],[320,228],[513,250],[400,249],[536,467],[664,15],[840,747],[704,51],[355,133],[929,244],[226,37],[934,291],[738,76],[728,269],[927,566],[937,498],[538,52],[922,680],[882,482],[844,127],[902,37],[956,803],[764,443],[758,565],[799,490],[337,257],[678,106],[625,67],[562,498],[975,805],[386,142],[730,125],[725,127],[975,2],[765,210],[594,445],[809,772],[509,115],[699,96],[980,529],[671,75],[600,300],[919,246],[925,365],[909,160],[843,182],[732,540],[187,100],[577,220],[744,67],[537,463],[571,379],[323,166],[995,872],[944,786],[668,652],[476,55],[618,0],[741,202],[531,376],[931,175],[767,6],[634,254],[710,87],[585,335],[917,791],[352,203],[718,67],[551,295],[654,548],[739,249],[997,870],[269,146],[447,5],[463,109],[490,147],[860,512],[932,496],[696,140],[694,291],[846,348],[959,541],[393,141],[858,539],[155,83],[624,17],[736,23],[648,585],[626,84],[162,14],[660,226],[809,598],[783,297],[742,632],[726,341],[798,183],[557,323],[855,22],[840,178],[302,18],[933,438],[383,96],[593,373],[570,29],[906,366],[535,420],[793,723],[857,435],[207,114],[151,26],[930,325],[917,713],[959,428],[919,604],[987,620],[501,267],[696,27],[982,255],[732,678],[835,545],[662,509],[938,559],[986,841],[518,189],[568,329],[774,556],[848,838],[865,383],[842,293],[360,189],[583,221],[800,778],[748,286],[686,398],[667,138],[268,4],[403,44],[854,139],[421,302],[733,374],[431,291],[790,688],[783,123],[783,752],[654,508],[952,342],[956,286],[499,225],[730,184],[653,541],[715,571],[276,11],[990,305],[535,440],[360,157],[874,87],[974,708],[648,155],[537,285],[889,643],[345,205],[229,58],[737,451],[586,64],[894,27],[627,305],[899,499],[229,112],[544,349],[750,520],[466,13],[511,300],[979,8],[708,499],[825,467],[655,468],[391,112],[600,270],[599,21],[734,149],[331,234],[611,211],[757,123],[887,408],[584,107],[897,148],[695,395],[784,11],[893,498],[524,20],[997,370],[464,355],[845,547],[861,793],[952,365],[651,567],[562,520],[673,563],[489,220],[391,369],[891,135],[753,247],[563,545],[962,957],[962,746],[758,57],[913,891],[520,84],[288,88],[811,191],[648,378],[830,405],[596,562],[392,386],[452,21],[868,815],[811,714],[543,46],[753,279],[861,745],[587,398],[761,334],[145,116],[718,206],[627,472],[613,601],[994,148],[583,197],[225,196],[543,302],[959,646],[918,849],[945,384],[427,376],[802,269],[614,139],[544,489],[735,631],[587,218],[16,4],[756,245],[457,405],[42,5],[773,754],[853,34],[899,609],[920,143],[905,835],[787,759],[369,368],[859,536],[916,156],[817,84],[400,289],[900,583],[496,210],[625,8],[439,410],[919,842],[473,121],[622,133],[548,217],[876,634],[573,110],[747,348],[639,75],[938,378],[642,71],[830,531],[313,22],[776,560],[934,710],[934,126],[238,60],[89,10],[733,433],[932,50],[885,558],[987,474],[964,523],[953,546],[835,766],[561,22],[943,473],[414,87],[730,357],[990,702],[969,949],[663,641],[750,385],[989,330],[799,510],[636,190],[797,206],[830,826],[579,161],[857,387],[844,709],[677,497],[659,638],[410,120],[271,13],[563,51],[875,320],[972,466],[805,578],[728,674],[503,10],[786,8],[617,383],[625,297],[378,182],[557,39],[459,185],[305,175],[701,41],[605,8],[660,463],[945,369],[758,366],[506,119],[482,2],[748,360],[845,155],[540,432],[353,12],[967,197],[634,381],[854,788],[933,166],[489,313],[689,489],[770,406],[780,243],[389,176],[695,535],[937,795],[574,384],[544,448],[924,459],[882,358],[375,279],[730,176],[739,122],[455,4],[662,322],[872,438],[980,858],[815,318],[640,116],[786,537],[571,49],[925,314],[796,335],[877,569],[741,63],[345,8],[495,391],[827,93],[826,451],[851,158],[662,73],[719,62],[894,326],[495,148],[854,113],[253,54],[649,394],[378,85],[836,532],[123,66],[971,413],[964,502],[468,292],[588,184],[475,208],[764,517],[329,150],[416,379],[677,45],[857,109],[840,115],[779,531],[795,715],[608,391],[379,194],[695,414],[578,451],[871,681],[646,580],[855,821],[437,280],[786,706],[739,544],[506,16],[895,881],[471,90],[645,266],[410,49],[483,72],[876,502],[749,666],[739,221],[455,90],[670,315],[614,397],[491,128],[657,137],[849,842],[926,895],[408,283],[428,303],[965,263],[424,264],[83,28],[925,94],[827,346],[614,190],[570,48],[429,351],[136,107],[883,45],[500,223],[737,269],[940,40],[942,889],[763,717],[747,561],[721,288],[319,27],[449,199],[852,646],[812,290],[883,646],[505,165],[589,420],[754,134],[789,599],[131,79],[984,831],[332,217],[753,7],[945,664],[807,476],[860,777],[67,62],[658,128],[473,335],[655,56],[841,154],[915,566],[857,42],[464,456],[997,866],[654,339],[945,316],[642,132],[939,564],[206,205],[781,237],[794,636],[292,155],[580,79],[982,964],[984,633],[573,51],[991,19],[510,76],[646,587],[875,288],[863,509],[828,263],[920,52],[733,647],[650,417],[975,13],[870,366],[488,68],[718,551],[845,451],[698,121],[960,801],[654,122],[614,497],[666,545],[68,40],[604,585],[888,34],[901,162],[947,2],[697,666],[997,855],[473,275],[125,91],[806,336],[637,379],[795,734],[867,771],[520,222],[642,427],[653,97],[263,262],[773,205],[515,387],[908,193],[804,150],[995,303],[877,163],[560,298],[492,362],[417,382],[797,752],[891,231],[724,432],[420,288],[513,237],[412,123],[266,186],[990,374],[983,126],[424,162],[997,528],[483,164],[736,694],[755,6],[338,79],[878,777],[657,398],[219,9],[986,1],[438,338],[257,181],[588,470],[511,237],[675,171],[524,503],[717,171],[805,413],[973,653],[252,243],[670,155],[186,143],[755,608],[485,437],[691,58],[533,397],[806,294],[975,758],[978,472],[938,246],[802,12],[724,704],[930,318],[808,108],[377,140],[380,85],[311,225],[489,198],[38,9],[882,805],[730,472],[644,478],[978,883],[375,211],[817,91],[840,314],[403,196],[319,161],[899,299],[700,218],[919,673],[219,65],[595,461],[362,184],[971,831],[908,468],[999,934],[284,146],[273,140],[594,207],[958,116],[767,570],[733,413],[256,52],[694,414],[850,379],[925,646],[780,20],[776,386],[394,171],[555,471],[703,135],[299,149],[762,656],[590,135],[966,548],[920,906],[787,357],[737,338],[776,545],[690,523],[389,142],[936,180],[545,473],[991,328],[946,736],[951,263],[525,351],[994,517],[679,341],[899,63],[870,637],[817,785],[780,662],[160,53],[575,312],[600,204],[676,606],[900,812],[765,391],[990,157],[770,764],[341,209],[802,373],[861,738],[828,149],[535,459],[723,63],[854,507],[646,466],[951,534],[695,426],[553,319],[443,257],[370,306],[644,135],[885,623],[878,876],[567,383],[260,157],[569,301],[941,41],[972,763],[578,113],[731,361],[123,91],[828,317],[134,115],[985,336],[866,542],[644,71],[201,134],[242,64],[608,284],[625,439],[650,53],[765,395],[468,418],[445,142],[816,296],[878,764],[771,333],[875,425],[843,329],[834,469],[669,605],[388,324],[646,640],[526,88],[558,87],[878,571],[784,204],[864,331],[550,317],[921,138],[490,4],[906,811],[613,59],[792,183],[820,348],[646,195],[822,427],[674,440],[377,84],[999,514],[883,750],[888,762],[891,621],[624,613],[516,300],[748,542],[689,26],[767,583],[746,437],[537,292],[985,658],[369,336],[497,288],[439,17],[920,86],[456,55],[862,753],[342,158],[807,569],[507,135],[337,85],[484,11],[949,82],[729,461],[682,443],[495,245],[666,177],[910,136],[636,377],[499,436],[427,412],[925,84],[755,115],[667,647],[465,139],[915,169],[953,541],[729,685],[760,82],[593,574],[560,541],[938,712],[700,259],[760,706],[591,164],[971,218],[779,557],[742,323],[861,263],[662,233],[879,821],[636,95],[489,377],[489,271],[702,1],[601,487],[588,145],[526,276],[627,619],[486,362],[547,342],[709,415],[909,715],[620,7],[188,35],[889,172],[717,162],[858,388],[593,451],[885,772],[521,430],[956,375],[854,459],[776,325],[895,476],[903,156],[908,115],[321,128],[884,759],[923,802],[788,656],[741,272],[884,17],[948,455],[783,40],[985,551],[872,470],[536,99],[879,591],[780,509],[569,560],[809,408],[723,602],[481,199],[977,526],[953,280],[770,365],[230,83],[932,231],[779,652],[914,141],[624,249],[859,698],[849,173],[248,239],[544,336],[790,488],[857,421],[913,24],[935,50],[972,666],[673,630],[390,192],[134,121],[332,317],[659,341],[906,187],[378,38],[918,497],[111,108],[553,61],[526,234],[211,205],[972,777],[723,573],[871,796],[425,380],[945,286],[687,311],[624,97],[692,455],[876,185],[573,49],[819,382],[670,41],[812,563],[705,274],[476,197],[604,137],[703,393],[444,148],[939,217],[722,349],[953,212],[698,515],[725,605],[563,404],[860,97],[735,551],[838,516],[428,275],[812,2],[580,572],[955,342],[614,539],[538,201],[809,202],[626,227],[940,242],[296,190],[612,496],[756,504],[573,72],[620,605],[799,256],[505,63],[750,362],[994,979],[432,265],[328,201],[680,11],[212,185],[852,209],[826,95],[326,280],[443,109],[609,502],[258,189],[701,473],[548,33],[910,901],[838,553],[531,493],[972,396],[444,88],[342,10],[295,24],[586,286],[862,42],[303,180],[186,89],[577,168],[699,440],[494,452],[924,780],[261,186],[107,70],[385,226],[989,962],[181,148],[492,256],[664,198],[80,63],[510,297],[541,71],[718,645],[899,704],[828,305],[285,283],[982,472],[701,279],[894,675],[662,137],[844,121],[918,435],[668,604],[461,195],[417,249],[971,616],[873,408],[825,324],[190,46],[927,808],[880,675],[489,424],[649,585],[606,343],[328,322],[658,213],[793,502],[70,45],[662,388],[508,498],[650,78],[129,45],[780,718],[821,707],[277,127],[836,186],[951,944],[183,58],[578,208],[586,417],[935,84],[705,590],[533,263],[597,243],[580,420],[510,143],[984,941],[508,35],[598,304],[692,183],[721,249],[949,455],[648,315],[757,545],[845,186],[911,447],[818,761],[229,162],[702,17],[419,151],[678,259],[565,319],[813,216],[947,758],[402,257],[778,761],[613,269],[930,613],[701,242],[749,125],[876,189],[168,123],[567,167],[641,415],[825,666],[704,229],[920,901],[162,97],[70,22],[860,442],[271,257],[635,162],[572,79],[658,404],[823,604],[293,228],[856,193],[849,690],[580,418],[889,634],[557,358],[392,188],[715,359],[556,90],[779,490],[932,770],[951,27],[261,21],[229,28],[811,244],[943,588],[157,102],[998,806],[728,623],[875,181],[887,72],[850,840],[274,267],[373,226],[483,153],[748,549],[911,821],[943,764],[230,159],[650,11],[450,69],[726,52],[925,338],[398,396],[677,567],[799,499],[763,1],[937,774],[999,739],[609,126],[927,277],[846,384],[728,487],[199,96],[727,395],[842,730],[559,105],[360,167],[929,708],[924,638],[753,718],[843,445],[646,193],[658,532],[703,104],[733,605],[630,369],[898,332],[886,870],[720,315],[612,579],[617,277],[252,246],[774,535],[916,765],[985,547],[915,476],[610,358],[785,59],[648,573],[890,447],[869,336],[556,330],[676,601],[942,679],[867,566],[539,156],[333,182],[678,370],[987,434],[944,341],[952,857],[773,444],[668,138],[482,42],[959,357],[914,217],[741,276],[719,604],[657,439],[823,255],[704,244],[903,3],[619,266],[658,133],[630,377],[519,426],[917,77],[425,359],[551,166],[918,847],[710,485],[887,531],[553,355],[426,188],[412,245],[514,475],[681,328],[729,530],[622,304],[775,383],[693,339],[414,389],[200,29],[320,199],[963,326],[571,398],[588,465],[715,144],[925,307],[792,547],[378,318],[516,161],[893,60],[246,29],[943,278],[923,415],[528,485],[727,497],[796,97],[431,41],[860,391],[555,93],[773,368],[678,515],[898,141],[941,381],[814,332],[565,254],[569,154],[675,60],[932,315],[692,186],[564,475],[365,84],[966,154],[400,16],[876,18],[545,240],[983,253],[340,215],[358,263],[604,212],[528,36],[803,191],[837,718],[974,738],[453,362],[140,108],[278,177],[878,654],[607,172],[448,123],[895,531],[997,221],[925,373],[773,103],[311,53],[263,121],[690,117],[946,89],[718,192],[949,818],[683,277],[457,387],[408,30],[888,373],[196,166],[896,283],[606,65],[743,42],[809,266],[896,421],[207,141],[197,71],[328,192],[515,458],[860,758],[515,92],[478,147],[542,41],[878,480],[757,226],[518,59],[824,249],[43,15],[711,549],[563,261],[772,347],[342,166],[556,523],[987,481],[720,550],[661,343],[252,182],[420,282],[831,810],[965,473],[934,372],[602,286],[104,45],[903,701],[625,30],[447,12],[103,50],[225,157],[245,232],[931,329],[909,72],[975,400],[583,259],[950,4],[293,44],[955,315],[231,185],[801,719],[879,145],[965,379],[165,7],[975,451],[703,322],[746,633],[583,19],[883,870],[650,179],[431,187],[709,200],[697,489],[877,300],[903,820],[847,184],[625,537],[403,301],[698,397],[517,101],[832,241],[796,164],[651,244],[742,262],[723,193],[865,753],[384,335],[882,155],[818,630],[900,594],[613,467],[250,80],[732,267],[849,681],[330,47],[288,62],[729,351],[394,384],[394,122],[586,92],[755,203],[391,345],[761,130],[808,327],[169,118],[880,232],[770,68],[581,46],[396,276],[613,98],[733,39],[344,147],[856,752],[367,128],[946,261],[867,412],[961,442],[897,263],[781,154],[998,270],[281,71],[893,666],[660,244],[856,167],[925,774],[572,158],[956,20],[932,547],[820,200],[809,710],[763,298],[681,81],[960,941],[155,150],[588,403],[576,63],[954,952],[855,245],[988,888],[811,505],[723,680],[35,10],[655,641],[744,160],[692,121],[768,517],[965,864],[957,669],[498,84],[998,37],[993,36],[711,253],[691,459],[700,631],[868,398],[515,178],[326,274],[992,546],[55,1],[696,569],[997,465],[607,225],[771,596],[410,295],[862,94],[784,478],[992,967],[766,268],[855,99],[375,374],[558,345],[685,215],[431,177],[994,952],[787,175],[207,45],[281,96],[349,256],[874,134],[862,24],[969,492],[523,128],[395,333],[613,385],[997,205],[839,815],[730,38],[985,266],[459,428],[866,389],[816,229],[410,255],[409,237],[742,353],[338,73],[870,101],[621,32],[975,501],[747,336],[339,198],[599,345],[739,383],[765,491],[313,94],[784,771],[678,65],[841,92],[605,527],[719,610],[637,77],[250,85],[811,260],[604,549],[124,14],[491,34],[676,75],[958,133],[742,709],[541,347],[986,450],[605,39],[551,144],[329,205],[604,346],[845,773],[894,275],[925,767],[864,407],[951,445],[317,110],[880,367],[923,307],[642,567],[889,466],[848,317],[799,362],[965,23],[546,524],[889,222],[769,244],[780,489],[473,375],[402,308],[251,175],[769,444],[208,45],[250,120],[871,174],[462,52],[807,437],[647,78],[830,292],[231,145],[971,861],[465,166],[667,123],[539,172],[935,227],[811,17],[909,464],[543,264],[595,45],[623,475],[560,330],[186,79],[952,901],[537,174],[429,243],[369,100],[914,730],[241,67],[535,15],[877,351],[998,319],[548,181],[944,716],[812,747],[979,642],[975,101],[751,143],[988,906],[957,906],[312,21],[607,465],[927,523],[922,902],[836,604],[339,330],[912,236],[670,668],[841,77],[708,216],[446,241],[997,318],[978,306],[181,179],[723,127],[613,337],[974,673],[785,622],[924,63],[622,55],[981,354],[603,46],[549,6],[696,63],[542,517],[995,713],[568,481],[739,570],[722,535],[931,806],[941,297],[212,4],[784,221],[507,340],[280,267],[927,787],[854,310],[829,47],[519,163],[614,221],[807,166],[219,187],[981,539],[996,423],[838,13],[747,33],[945,672],[916,758],[988,717],[190,22],[754,56],[960,364],[870,846],[405,229],[792,142],[598,375],[447,25],[985,639],[869,95],[478,97],[826,310],[637,603],[282,34],[790,532],[600,176],[791,257],[256,157],[423,155],[920,561],[224,8],[858,122],[888,64],[826,442],[865,629],[555,551],[769,376],[929,926],[946,303],[961,619],[519,74],[923,138],[778,769],[554,479],[812,703],[622,87],[601,227],[754,468],[901,363],[606,395],[263,213],[838,824],[908,748],[630,50],[873,662],[680,669],[409,141],[300,240],[268,19],[521,17],[925,748],[623,61],[686,299],[773,147],[778,582],[582,306],[488,362],[782,289],[999,551],[863,114],[777,717],[983,811],[848,462],[808,664],[722,220],[942,19],[403,317],[815,96],[869,283],[436,275],[861,108],[458,317],[762,258],[993,938],[901,809],[718,400],[883,154],[700,297],[380,189],[741,624],[994,457],[828,391],[516,172],[547,130],[589,299],[267,8],[998,688],[886,164],[866,647],[355,72],[516,317],[748,49],[530,155],[538,319],[974,211],[900,271],[669,172],[703,465],[562,25],[457,443],[782,81],[345,56],[850,811],[924,612],[602,56],[665,657],[30,9],[513,150],[966,119],[373,96],[724,402],[979,668],[755,510],[450,13],[990,982],[655,239],[370,263],[170,80],[505,23],[807,781],[816,92],[523,414],[782,736],[721,381],[693,374],[466,67],[868,510],[364,353],[759,681],[782,614],[666,407],[229,118],[980,514],[913,203],[379,230],[558,342],[463,144],[517,504],[948,331],[576,120],[912,576],[718,581],[448,439],[854,479],[779,724],[738,393],[398,361],[869,302],[610,188],[961,317],[581,343],[552,48],[445,344],[992,471],[323,295],[881,742],[974,878],[971,313],[735,563],[419,310],[481,148],[791,211],[797,131],[908,907],[636,464],[703,47],[529,364],[890,572],[561,300],[216,182],[588,478],[796,233],[891,776],[591,139],[617,213],[949,434],[806,743],[503,203],[943,738],[586,555],[282,193],[750,226],[334,294],[870,457],[798,302],[900,351],[517,335],[514,138],[892,511],[515,283],[744,511],[664,427],[786,671],[745,122],[831,613],[432,309],[964,171],[517,62],[698,485],[106,25],[820,625],[107,33],[759,348],[628,7],[975,585],[950,147],[418,333],[776,313],[947,119],[563,285],[872,588],[685,393],[460,372],[571,260],[495,150],[274,264],[914,512],[529,285],[714,612],[819,711],[394,219],[716,529],[543,92],[468,80],[178,174],[286,281],[981,696],[529,502],[465,157],[629,365],[445,368],[90,54],[213,14],[844,561],[935,913],[771,206],[969,444],[610,370],[558,203],[701,307],[283,137],[920,865],[366,222],[657,520],[964,482],[696,22],[801,589],[604,586],[794,746],[649,247],[952,587],[892,437],[404,87],[910,739],[868,684],[940,609],[897,96],[808,511],[244,240],[837,357],[527,477],[953,654],[646,86],[653,328],[518,118],[881,262],[662,446],[315,52],[731,171],[907,731],[382,323],[339,228],[715,297],[527,285],[901,844],[914,48],[237,66],[682,656],[980,1],[782,653],[705,376],[522,248],[633,75],[796,45],[531,386],[959,840],[489,157],[592,292],[702,39],[788,621],[955,821],[777,764],[685,568],[617,279],[539,3],[786,315],[945,617],[622,543],[950,918],[650,107],[427,426],[356,175],[497,48],[932,225],[905,647],[446,57],[783,662],[769,652],[416,345],[524,370],[256,189],[810,148],[811,790],[685,518],[720,351],[940,542],[934,167],[953,442],[915,695],[721,524],[394,32],[562,560],[430,368],[378,264],[996,819],[452,437],[456,206],[973,445],[168,19],[706,212],[525,463],[629,533],[904,845],[972,649],[546,277],[996,248],[658,507],[408,7],[759,705],[433,39],[944,456],[578,167],[286,229],[956,85],[715,168],[908,435],[437,74],[778,165],[764,536],[406,397],[835,834],[317,306],[996,273],[760,701],[729,401],[347,166],[906,223],[954,756],[601,311],[977,384],[869,373],[703,514],[499,59],[427,373],[856,800],[330,125],[826,1],[48,28],[800,405],[364,70],[216,165],[831,665],[758,638],[476,75],[837,258],[709,232],[831,701],[596,550],[481,333],[671,331],[681,588],[814,77],[741,686],[421,191],[708,603],[841,358],[832,69],[802,354],[759,283],[602,578],[615,588],[790,600],[457,229],[846,244],[874,837],[84,73],[738,556],[722,338],[545,54],[819,773],[606,341],[487,315],[671,527],[920,522],[972,86],[755,540],[915,97],[492,392],[532,227],[794,415],[111,71],[993,84],[741,388],[56,37],[762,314],[492,199],[906,858],[657,143],[855,810],[434,263],[653,361],[434,203],[642,400],[84,15],[640,14],[793,576],[580,444],[859,700],[313,143],[588,259],[964,758],[985,204],[732,397],[697,441],[499,298],[865,331],[788,589],[862,689],[762,140],[729,598],[800,482],[977,358],[332,328],[936,508],[968,538],[822,629],[873,440],[926,273],[213,151],[626,9],[669,331],[518,387],[592,324],[860,122],[751,511],[718,496],[440,0],[486,105],[891,156],[971,130],[131,71],[812,248],[749,480],[584,231],[567,229],[299,25],[907,176],[716,309],[797,145],[969,855],[642,291],[195,117],[737,11],[831,186],[951,307],[903,886],[917,202],[877,348],[599,270],[375,361],[283,60],[765,542],[761,760],[945,396],[677,506],[952,314],[544,149],[881,290],[693,26],[549,356],[312,32],[461,265],[365,250],[358,241],[613,521],[624,552],[969,284],[270,141],[531,109],[546,347],[677,62],[689,609],[200,60],[661,255],[774,177],[459,139],[955,531],[595,564],[679,172],[798,476],[461,119],[612,44],[871,595],[454,264],[757,479],[836,105],[785,749],[976,279],[566,215],[829,88],[533,494],[302,258],[566,502],[836,539],[153,51],[949,23],[776,369],[578,306],[953,139],[576,551],[412,19],[744,323],[640,135],[183,7],[705,456],[571,294],[799,29],[974,843],[829,228],[952,164],[837,191],[573,276],[79,20],[881,761],[826,234],[742,576],[330,287],[650,19],[675,350],[595,127],[675,585],[697,519],[480,269],[194,31],[745,668],[373,234],[324,39],[897,66],[777,371],[781,543],[581,458],[618,405],[729,536],[407,211],[822,511],[900,145],[581,570],[320,179],[234,125],[763,106],[799,220],[830,176],[702,554],[985,823],[920,73],[780,462],[795,386],[722,30],[910,400],[525,509],[370,93],[895,80],[599,374],[680,379],[941,154],[996,889],[671,129],[984,494],[895,780],[391,63],[915,569],[490,220],[279,38],[786,657],[875,4],[924,22],[624,121],[747,598],[778,467],[355,315],[854,203],[772,317],[443,329],[535,102],[854,301],[801,13],[679,653],[837,355],[894,512],[541,512],[505,110],[927,4],[782,123],[663,443],[643,598],[542,487],[448,26],[454,391],[787,575],[375,373],[223,166],[904,757],[738,385],[814,127],[685,651],[837,385],[580,128],[711,334],[700,496],[492,265],[919,239],[939,624],[671,238],[928,106],[628,481],[885,483],[343,169],[370,240],[643,466],[543,36],[692,191],[921,441],[541,513],[608,254],[965,635],[788,26],[830,414],[657,99],[888,197],[887,601],[956,394],[806,186],[338,102],[873,356],[812,507],[883,248],[270,138],[993,473],[386,217],[50,5],[909,532],[369,35],[810,486],[668,154],[44,34],[604,420],[897,619],[912,905],[85,4],[871,449],[612,15],[882,142],[367,314],[832,654],[941,764],[209,75],[793,269],[333,38],[958,227],[991,474],[855,434],[910,406],[780,156],[945,295],[715,80],[808,172],[514,39],[918,653],[658,346],[873,325],[743,62],[999,49],[711,446],[208,163],[155,52],[906,726],[575,384],[999,878],[544,417],[444,350],[730,239],[921,363],[202,1],[943,244],[654,152],[739,267],[257,2],[773,43],[362,311],[848,575],[972,808],[600,428],[368,164],[818,675],[134,67],[834,498],[940,915],[980,597],[927,549],[353,341],[968,201],[943,206],[818,315],[709,335],[464,296],[911,156],[943,5],[978,132],[318,9],[708,608],[607,191],[940,200],[736,53],[663,238],[362,111],[930,187],[584,398],[375,215],[257,156],[737,313],[800,280],[748,249],[857,177],[681,657],[771,77],[989,722],[448,278],[865,243],[747,676],[323,17],[807,110],[993,497],[311,254],[928,586],[617,594],[518,322],[217,7],[559,230],[869,702],[902,115],[538,227],[756,403],[564,300],[451,205],[707,101],[545,145],[852,438],[585,61],[814,144],[628,84],[577,19],[995,400],[948,715],[980,399],[430,290],[703,524],[321,95],[547,385],[569,362],[976,80],[733,64],[732,400],[960,547],[850,236],[752,494],[822,225],[589,392],[955,188],[998,471],[650,467],[818,219],[591,582],[760,55],[964,463],[267,214],[989,555],[795,95],[573,13],[754,633],[508,88],[275,136],[847,106],[842,338],[843,494],[878,211],[733,546],[589,495],[552,374],[958,328],[863,74],[755,36],[660,534],[743,495],[847,394],[879,849],[766,289],[787,468],[666,610],[642,495],[917,39],[766,166],[394,342],[740,117],[713,246],[621,28],[555,37],[770,372],[506,395],[890,502],[609,492],[460,84],[247,181],[888,409],[707,601],[320,213],[717,178],[540,159],[887,206],[552,478],[674,561],[263,31],[639,463],[799,709],[286,94],[575,415],[321,226],[683,199],[428,142],[622,575],[546,415],[635,71],[275,215],[738,509],[774,677],[808,22],[760,327],[707,491],[182,158],[625,146],[999,231],[934,592],[967,264],[890,740],[927,925],[417,140],[453,314],[912,23],[610,328],[704,685],[331,50],[957,548],[348,334],[236,63],[360,94],[459,99],[362,305],[446,422],[180,121],[142,63],[348,56],[657,538],[663,326],[848,520],[460,221],[768,247],[868,298],[219,106],[131,114],[788,615],[819,224],[905,504],[980,603],[818,437],[736,626],[281,240],[324,58],[777,24],[830,456],[682,90],[991,482],[794,579],[789,736],[534,355],[203,61],[798,711],[653,473],[477,289],[690,263],[899,47],[604,142],[967,388],[196,141],[836,420],[519,350],[139,125],[819,265],[266,56],[901,370],[417,266],[821,28],[908,376],[804,540],[931,788],[334,212],[794,219],[667,8],[983,501],[783,93],[607,461],[788,437],[795,278],[987,722],[615,132],[664,339],[484,113],[756,356],[587,291],[680,382],[945,535],[347,302],[967,41],[408,168],[907,636],[980,637],[944,233],[254,165],[960,679],[256,248],[408,256],[161,36],[918,895],[167,130],[307,300],[721,32],[979,244],[930,204],[735,576],[797,610],[376,11],[676,536],[687,232],[617,582],[232,132],[663,203],[527,517],[620,120],[628,335],[592,204],[753,408],[848,533],[659,500],[997,274],[552,401],[885,750],[812,340],[805,479],[721,351],[65,31],[994,322],[825,626],[576,491],[673,181],[594,534],[959,141],[630,525],[958,513],[960,219],[681,587],[927,367],[572,400],[640,343],[550,300],[796,426],[563,235],[981,169],[546,498],[297,69],[458,4],[923,297],[845,342],[723,531],[670,223],[998,114],[529,320],[687,194],[553,216],[760,630],[837,688],[601,456],[945,408],[722,38],[466,144],[975,334],[869,353],[900,630],[884,274],[305,114],[510,96],[623,528],[759,488],[677,480],[495,327],[421,221],[920,772],[773,130],[610,125],[850,812],[985,177],[469,316],[823,381],[601,115],[586,312],[594,430],[859,262],[934,406],[829,320],[931,578],[695,425],[318,214],[829,101],[880,472],[453,252],[602,270],[241,37],[712,415],[600,386],[461,228],[575,202],[995,642],[622,92],[455,141],[482,191],[643,479],[404,248],[666,513],[461,239],[858,70],[145,106],[888,716],[494,344],[638,173],[751,344],[784,602],[556,86],[813,269],[541,124],[948,241],[825,372],[988,45],[790,519],[689,611],[577,14],[665,297],[869,158],[777,737],[571,523],[662,164],[677,9],[585,113],[966,935],[767,755],[329,134],[319,174],[783,569],[883,508],[648,570],[261,157],[986,487],[935,684],[689,65],[790,351],[834,288],[738,148],[854,803],[805,766],[997,941],[622,165],[848,755],[334,325],[209,60],[359,116],[371,320],[883,351],[995,913],[773,133],[940,537],[815,473],[642,456],[904,658],[342,238],[490,88],[992,453],[855,38],[764,583],[982,149],[527,352],[631,416],[760,548],[526,81],[473,22],[632,246],[987,177],[724,151],[577,145],[643,512],[440,316],[308,43],[532,140],[800,365],[572,112],[848,744],[957,434],[196,72],[737,593],[457,50],[402,358],[980,801],[287,199],[643,546],[857,552],[474,466],[264,123],[989,495],[586,487],[897,252],[895,629],[582,18],[822,481],[848,695],[549,523],[893,693],[822,574],[695,670],[531,70],[752,149],[746,105],[668,450],[460,286],[455,8],[621,516],[605,361],[391,157],[978,849],[630,183],[285,57],[456,57],[893,789],[891,47],[606,166],[877,538],[724,2],[387,6],[385,241],[439,305],[780,126],[413,155],[342,20],[346,7],[168,86],[452,64],[730,318],[975,443],[979,201],[701,136],[872,259],[749,582],[872,582],[694,100],[377,5],[598,131],[474,38],[916,384],[503,181],[403,214],[477,470],[983,188],[706,287],[967,502],[947,454],[779,685],[511,480],[665,64],[655,589],[623,226],[768,118],[912,51],[961,352],[300,117],[422,109],[922,323],[923,715],[640,451],[959,711],[761,230],[691,362],[550,96],[803,296],[597,349],[525,313],[789,734],[831,175],[725,416],[990,672],[428,65],[668,560],[960,504],[940,470],[229,195],[471,191],[501,491],[700,296],[935,326],[514,502],[834,500],[587,419],[514,256],[922,639],[957,588],[640,373],[309,195],[788,608],[597,120],[454,49],[821,376],[477,96],[977,300],[723,677],[936,656],[617,151],[416,53],[766,93],[639,538],[764,232],[234,85],[889,350],[966,504],[989,406],[833,674],[368,175],[180,80],[478,454],[404,229],[600,320],[688,516],[868,744],[468,152],[654,140],[762,727],[912,291],[720,76],[650,534],[548,34],[470,376],[543,498],[595,194],[559,145],[896,513],[497,69],[904,484],[945,51],[379,19],[812,734],[462,261],[726,552],[585,84],[653,234],[911,592],[610,85],[722,581],[391,378],[442,94],[692,473],[817,236],[429,113],[147,0],[600,6],[75,62],[440,384],[991,814],[573,337],[550,234],[900,450],[915,239],[510,260],[791,74],[964,190],[350,315],[439,109],[691,388],[608,561],[826,104],[904,666],[966,945],[948,691],[766,310],[936,317],[655,394],[985,720],[888,841],[857,763],[518,351],[819,535],[716,118],[803,719],[992,313],[434,432],[221,147],[880,868],[858,442],[624,468],[884,41],[919,750],[865,546],[800,577],[653,122],[668,391],[488,162],[518,273],[852,63],[763,621],[675,150],[840,777],[732,477],[240,127],[633,395],[983,46],[631,597],[411,77],[736,629],[823,372],[880,269],[912,308],[560,147],[808,618],[202,28],[906,229],[512,423],[867,254],[693,446],[559,320],[895,707],[98,45],[505,302],[390,85],[574,184],[860,35],[961,373],[963,107],[726,159],[831,284],[450,89],[893,237],[815,116],[733,199],[919,718],[713,469],[831,393],[881,189],[991,756],[702,527],[987,55],[871,808],[407,200],[960,117],[877,276],[923,285],[306,277],[319,317],[579,29],[88,14],[835,53],[678,50],[499,72],[897,378],[499,380],[652,431],[829,330],[626,440],[477,287],[705,581],[514,37],[865,77],[743,471],[994,899],[364,242],[982,748],[530,198],[996,377],[608,67],[441,149],[578,414],[588,105],[595,586],[508,383],[695,317],[734,181],[757,501],[795,611],[951,242],[222,66],[822,792],[890,760],[754,203],[535,515],[159,145],[247,54],[877,595],[937,36],[483,215],[407,338],[511,508],[916,847],[709,680],[423,397],[671,33],[503,159],[507,73],[727,73],[936,188],[756,44],[736,155],[759,243],[913,587],[971,403],[801,297],[729,81],[208,14],[794,756],[539,336],[90,43],[327,78],[999,66],[669,129],[658,278],[968,697],[951,401],[836,683],[439,214],[552,341],[557,313],[661,139],[272,266],[672,232],[979,584],[800,324],[731,324],[709,607],[561,523],[661,289],[969,227],[303,71],[440,19],[622,389],[778,94],[512,166],[371,306],[334,46],[394,300],[984,802],[732,213],[822,145],[297,140],[952,724],[443,313],[930,544],[846,299],[680,664],[730,555],[569,512],[861,367],[904,56],[856,633],[741,215],[931,101],[939,656],[713,129],[908,591],[950,496],[951,178],[871,374],[362,229],[668,270],[880,587],[275,12],[856,297],[958,663],[901,5],[312,208],[956,886],[510,362],[711,102],[899,272],[895,28],[542,392],[883,49],[879,366],[665,51],[738,502],[852,699],[859,77],[720,314],[231,202],[834,805],[901,352],[910,146],[756,705],[237,24],[427,125],[711,54],[671,203],[878,201],[294,145],[874,27],[305,3],[633,404],[492,126],[589,141],[844,342],[345,197],[775,403],[930,663],[203,106],[666,418],[194,154],[959,90],[642,256],[369,194],[940,488],[920,28],[777,203],[648,478],[473,145],[287,278],[669,339],[416,108],[551,49],[902,542],[699,405],[943,97],[564,544],[566,32],[476,97],[533,504],[907,406],[767,637],[663,40],[852,737],[520,352],[484,464],[537,440],[856,700],[929,228],[807,622],[985,67],[278,24],[876,125],[663,512],[604,264],[682,357],[555,126],[510,205],[804,567],[604,118],[705,74],[932,97],[549,378],[524,204],[299,174],[903,310],[442,176],[670,133],[535,517],[316,58],[828,395],[623,239],[697,155],[656,208],[766,36],[926,548],[403,176],[945,584],[545,61],[947,856],[359,53],[340,0],[626,111],[935,411],[785,402],[786,324],[698,437],[747,339],[436,8],[994,736],[601,144],[380,298],[442,229],[104,5],[513,198],[515,155],[508,99],[534,273],[806,741],[398,339],[493,114],[665,185],[779,175],[392,186],[438,256],[638,266],[649,80],[561,62],[815,661],[915,344],[788,434],[576,359],[910,580],[830,82],[978,326],[940,613],[521,200],[410,204],[719,696],[218,61],[535,281],[818,261],[371,22],[144,68],[980,414],[722,662],[544,367],[454,19],[875,766],[784,473],[845,269],[497,110],[966,733],[962,244],[540,20],[253,52],[295,246],[809,517],[495,408],[816,384],[394,392],[367,259],[121,112],[922,373],[681,523],[978,219],[874,676],[889,154],[691,633],[720,673],[780,659],[374,226],[168,45],[803,410],[202,37],[589,492],[996,385],[443,356],[772,701],[412,66],[768,644],[136,2],[169,111],[166,88],[542,472],[642,54],[304,172],[537,213],[974,398],[472,226],[835,186],[362,60],[758,721],[917,916],[490,407],[838,248],[785,7],[285,241],[972,292],[780,360],[174,137],[939,128],[892,872],[923,674],[900,256],[845,92],[952,435],[873,410],[611,596],[985,457],[874,494],[625,276],[327,93],[627,185],[826,412],[566,85],[985,881],[804,250],[998,502],[477,331],[685,629],[961,244],[356,101],[876,555],[293,209],[943,128],[730,516],[454,83],[878,123],[915,723],[767,722],[960,24],[780,494],[916,617],[834,411],[868,464],[445,160],[475,379],[967,143],[994,944],[344,44],[244,30],[582,188],[538,258],[602,519],[771,593],[382,212],[656,68],[200,8],[857,168],[667,53],[687,50],[842,120],[890,261],[517,215],[508,10],[324,78],[637,60],[944,897],[804,707],[692,41],[228,124],[539,507],[595,450],[860,249],[638,243],[385,268],[814,761],[800,484],[967,121],[216,134],[630,391],[626,320],[970,316],[408,391],[614,492],[31,22],[727,597],[846,99],[720,124],[549,280],[715,313],[352,34],[710,582],[153,18],[732,23],[907,863],[575,343],[949,478],[981,292],[388,12],[382,37],[328,48],[542,334],[353,145],[83,63],[317,17],[422,181],[993,506],[759,526],[562,209],[628,288],[578,308],[251,108],[142,22],[221,170],[805,436],[537,348],[819,244],[536,251],[868,281],[764,123],[743,615],[737,642],[947,373],[617,398],[911,616],[617,25],[673,529],[555,38],[189,22],[525,128],[791,612],[447,372],[915,458],[916,833],[812,611],[332,94],[189,17],[934,858],[461,123],[887,633],[913,651],[507,504],[333,195],[789,593],[590,562],[635,530],[753,25],[246,181],[436,50],[843,48],[684,197],[290,128],[443,365],[693,596],[594,154],[301,30],[733,555],[804,408],[439,125],[874,103],[571,446],[865,669],[836,777],[987,967],[754,74],[777,462],[676,140],[831,830],[667,106],[825,608],[963,378],[709,60],[439,167],[659,576],[611,372],[995,301],[784,729],[894,396],[509,164],[882,196],[864,94],[827,526],[993,605],[540,57],[853,579],[914,197],[369,119],[877,860],[730,362],[371,359],[829,650],[606,91],[516,44],[401,202],[280,218],[664,304],[309,52],[978,265],[174,6],[183,145],[832,763],[449,171],[359,58],[906,221],[679,309],[930,722],[863,640],[504,14],[365,261],[782,147],[210,41],[885,60],[658,242],[854,39],[848,183],[829,555],[686,26],[288,140],[970,113],[321,315],[878,600],[825,200],[595,145],[847,448],[147,49],[594,16],[997,203],[628,150],[340,83],[271,55],[330,223],[937,671],[602,314],[393,66],[897,529],[443,4],[581,401],[844,643],[578,496],[790,735],[604,205],[980,969],[614,211],[925,824],[172,29],[348,163],[405,177],[475,449],[471,197],[991,139],[696,515],[909,422],[642,594],[657,282],[787,84],[910,583],[627,233],[687,301],[888,478],[397,119],[772,148],[826,654],[976,567],[534,357],[724,588],[865,439],[750,462],[613,135],[764,138],[917,482],[840,148],[308,39],[752,61],[937,393],[789,539],[781,261],[729,30],[260,251],[877,130],[929,719],[864,608],[923,591],[865,705],[485,358],[541,319],[964,245],[721,38],[752,228],[331,264],[840,587],[688,404],[711,201],[367,129],[988,40],[975,514],[313,204],[581,25],[644,411],[796,321],[389,131],[999,139],[526,353],[652,638],[941,87],[765,584],[343,306],[383,18],[830,593],[450,45],[406,214],[755,684],[773,671],[944,811],[330,159],[877,255],[488,66],[746,540],[477,11],[605,280],[853,495],[899,826],[907,875],[656,559],[574,299],[586,472],[885,189],[872,485],[328,132],[913,908],[658,103],[596,99],[877,768],[115,102],[997,879],[232,227],[719,60],[841,48],[663,361],[969,297],[347,306],[485,443],[669,137],[960,548],[557,152],[554,352],[779,13],[677,428],[935,436],[982,136],[883,620],[857,394],[586,12],[495,357],[69,3],[977,299],[648,319],[295,224],[934,298],[550,182],[386,349],[582,511],[969,466],[740,123],[582,414],[951,550],[841,58],[179,11],[731,685],[793,359],[899,230],[628,143],[954,414],[627,162],[747,712],[918,307],[836,212],[867,810],[898,222],[840,755],[659,329],[565,258],[762,203],[796,156],[971,322],[951,949],[853,583],[213,122],[674,356],[998,405],[955,349],[922,229],[529,238],[488,272],[887,545],[832,425],[877,147],[267,94],[556,305],[961,221],[715,518],[900,467],[762,641],[917,878],[252,37],[923,816],[785,426],[315,67],[393,21],[493,46],[624,14],[759,83],[819,815],[763,142],[508,330],[775,488],[550,410],[917,701],[950,743],[245,199],[481,167],[985,92],[928,205],[753,510],[705,701],[744,491],[371,222],[165,35],[348,62],[939,771],[721,325],[421,117],[786,434],[807,729],[848,596],[445,222],[539,117],[222,115],[664,385],[634,438],[579,11],[808,386],[657,578],[448,254],[670,653],[525,19],[426,284],[592,562],[766,622],[156,103],[803,681],[396,26],[992,216],[805,508],[826,543],[657,392],[918,381],[793,223],[433,267],[519,38],[270,248],[140,130],[931,339],[359,43],[963,906],[974,951],[530,365],[954,852],[553,381],[221,54],[492,187],[260,230],[860,838],[810,234],[106,42],[847,635],[330,278],[908,120],[717,429],[913,438],[639,63],[629,302],[952,659],[340,201],[934,255],[637,587],[599,534],[648,464],[936,577],[939,79],[656,280],[683,404],[800,86],[583,56],[576,403],[888,239],[115,66],[839,17],[764,727],[76,55],[957,924],[640,225],[733,257],[271,181],[667,353],[698,379],[567,447],[479,315],[751,59],[202,138],[607,235],[335,233],[982,89],[265,227],[627,458],[652,341],[519,105],[315,104],[594,313],[545,124],[617,478],[415,99],[285,284],[681,0],[878,13],[934,658],[927,272],[618,459],[547,534],[694,248],[810,130],[799,161],[956,810],[993,703],[890,291],[838,112],[144,29],[819,787],[120,34],[975,859],[351,134],[210,10],[779,455],[950,714],[716,276],[320,210],[825,252],[575,569],[875,170],[950,276],[709,136],[392,84],[618,235],[885,785],[359,324],[333,36],[937,283],[622,186],[544,395],[240,230],[381,179],[719,642],[502,262],[721,225],[890,874],[130,67],[875,770],[937,619],[903,745],[978,637],[893,646],[840,340],[503,414],[989,389],[853,798],[702,304],[947,901],[207,115],[405,309],[885,410],[944,497],[537,429],[331,189],[706,118],[942,685],[539,19],[285,33],[268,217],[437,223],[248,139],[676,518],[810,189],[667,293],[968,533],[810,295],[694,532],[855,79],[409,134],[456,63],[985,366],[975,239],[598,318],[475,237],[812,210],[892,760],[922,235],[561,448],[899,267],[714,497],[979,380],[751,436],[458,186],[52,23],[723,109],[165,124],[830,571],[855,795],[790,125],[756,353],[645,167],[537,278],[401,136],[469,330],[841,276],[731,334],[747,393],[898,725],[261,235],[681,511],[450,20],[400,69],[634,71],[539,133],[783,664],[691,69],[798,745],[651,75],[666,155],[835,633],[691,637],[576,153],[950,436],[436,292],[399,341],[245,58],[641,354],[924,847],[385,265],[596,446],[146,93],[711,333],[33,6],[399,89],[896,77],[920,435],[885,877],[893,771],[696,230],[913,429],[885,587],[862,728],[606,504],[513,300],[851,296],[541,273],[505,401],[457,31],[815,451],[556,81],[749,635],[394,201],[917,576],[301,269],[892,687],[864,603],[907,876],[707,137],[292,123],[50,6],[466,212],[724,675],[840,815],[879,237],[601,283],[246,59],[540,90],[718,101],[712,395],[821,489],[407,147],[725,203],[803,552],[609,554],[883,458],[358,253],[359,164],[379,332],[935,289],[366,97],[226,9],[553,431],[879,551],[660,65],[914,638],[830,175],[196,155],[256,107],[494,17],[730,23],[862,629],[549,425],[439,427],[233,141],[417,208],[492,325],[508,70],[989,188],[985,398],[303,153],[292,149],[981,826],[987,463],[856,661],[270,57],[801,472],[364,34],[990,749],[788,657],[934,156],[836,239],[791,774],[782,676],[897,856],[229,206],[914,908],[971,969],[921,246],[284,62],[886,389],[708,563],[240,28],[276,189],[844,438],[214,96],[893,809],[660,573],[407,397],[721,126],[676,396],[806,141],[929,840],[739,385],[667,367],[877,430],[441,198],[675,324],[552,44],[913,729],[923,534],[515,201],[663,549],[844,221],[658,170],[549,153],[212,29],[610,545],[433,222],[485,112],[699,374],[398,370],[850,609],[978,704],[625,344],[906,793],[969,326],[531,66],[938,744],[972,843],[860,680],[588,273],[550,46],[174,143],[547,115],[185,74],[716,525],[48,1],[430,54],[755,587],[897,394],[557,311],[666,621],[757,377],[832,166],[467,99],[637,5],[987,310],[549,360],[723,409],[820,789],[819,624],[290,85],[788,666],[594,136],[842,779],[486,404],[841,370],[795,491],[836,786],[685,361],[752,572],[437,278],[960,132],[428,256],[854,545],[956,666],[922,214],[896,528],[698,321],[767,96],[594,578],[870,781],[880,715],[717,223],[460,0],[443,318],[967,220],[852,345],[711,706],[364,205],[620,230],[897,127],[150,132],[704,19],[867,295],[406,340],[984,325],[337,310],[597,175],[716,660],[467,72],[461,46],[472,362],[481,73],[880,237],[287,68],[757,212],[683,106],[183,118],[642,241],[696,676],[748,131],[794,236],[986,309],[579,86],[597,177],[682,444],[181,29],[814,756],[708,176],[955,261],[702,641],[996,310],[828,222],[370,268],[716,562],[776,196],[592,37],[405,138],[487,142],[713,559],[788,600],[573,447],[299,224],[772,291],[417,310],[363,20],[821,678],[892,125],[386,359],[265,199],[998,877],[752,452],[985,32],[380,246],[819,372],[396,229],[580,34],[876,685],[810,297],[663,588],[989,686],[779,381],[808,252],[890,316],[967,45],[909,9],[330,236],[954,643],[727,617],[677,484],[842,258],[662,252],[515,417],[805,772],[815,27],[555,532],[762,471],[492,32],[612,575],[777,431],[742,49],[301,228],[916,66],[963,927],[272,268],[817,14],[995,261],[931,663],[341,268],[660,211],[70,43],[670,549],[937,424],[354,76],[280,78],[687,171],[897,531],[487,262],[588,244],[920,15],[775,148],[929,43],[919,868],[546,50],[749,306],[750,479],[311,119],[523,286],[982,349],[153,104],[289,248],[927,43],[844,211],[959,361],[800,34],[776,757],[625,279],[814,106],[128,107],[808,439],[765,423],[710,588],[681,189],[524,512],[734,514],[884,199],[980,564],[887,716],[150,54],[920,528],[837,111],[430,339],[942,580],[911,561],[880,310],[71,1],[891,289],[216,70],[825,499],[635,564],[858,242],[664,162],[794,451],[580,506],[591,153],[921,209],[947,260],[425,243],[424,146],[553,79],[785,196],[708,672],[643,453],[621,70],[945,432],[829,629],[723,396],[605,180],[975,350],[761,736],[593,246],[325,35],[519,448],[815,782],[924,9],[597,348],[642,584],[414,362],[933,787],[296,43],[770,677],[438,245],[738,256],[645,277],[921,581],[464,406],[337,279],[591,136],[682,506],[864,32],[408,171],[548,428],[338,216],[917,511],[378,249],[155,36],[700,277],[980,393],[858,628],[542,326],[912,729],[502,7],[984,148],[859,386],[470,343],[229,20],[479,110],[988,726],[326,16],[777,313],[761,263],[882,218],[139,106],[917,300],[556,524],[939,97],[945,801],[703,297],[331,279],[925,38],[437,266],[532,13],[840,662],[870,557],[604,189],[784,589],[415,33],[487,177],[967,376],[463,213],[518,304],[288,27],[576,572],[753,105],[300,249],[978,215],[452,186],[895,610],[663,90],[538,419],[458,93],[835,610],[624,179],[530,229],[494,72],[656,72],[251,159],[532,291],[464,41],[980,445],[722,116],[705,77],[755,752],[874,871],[370,115],[463,133],[945,90],[700,688],[402,336],[133,46],[993,519],[483,366],[811,99],[564,150],[794,742],[404,400],[766,615],[983,916],[187,123],[572,534],[522,482],[861,733],[880,634],[966,64],[501,483],[922,828],[374,263],[726,581],[788,576],[61,14],[226,156],[614,277],[947,406],[761,632],[996,563],[828,777],[899,423],[646,161],[308,102],[964,22],[406,255],[382,14],[850,358],[897,723],[457,371],[865,226],[402,236],[682,156],[828,112],[405,153],[860,507],[664,171],[826,186],[398,199],[413,41],[927,899],[658,263],[523,433],[910,431],[952,117],[138,116],[176,162],[994,416],[847,363],[936,158],[465,57],[739,618],[585,305],[743,541],[10,9],[789,16],[987,303],[740,595],[785,730],[535,9],[905,864],[740,429],[796,292],[976,626],[596,78],[263,61],[994,765],[993,465],[897,80],[493,239],[645,514],[736,22],[869,572],[480,428],[472,252],[566,208],[37,13],[762,724],[822,311],[746,266],[737,218],[970,510],[514,92],[970,741],[962,566],[773,298],[710,235],[962,361],[536,413],[927,534],[931,602],[462,153],[576,90],[640,572],[894,270],[969,777],[571,264],[578,34],[785,454],[546,506],[126,51],[406,173],[881,687],[348,144],[922,813],[666,88],[424,354],[120,87],[187,16],[485,54],[795,198],[876,838],[230,167],[500,64],[716,444],[220,40],[184,82],[897,249],[937,764],[765,169],[272,155],[309,34],[509,506],[641,79],[238,175],[945,193],[444,323],[105,51],[131,37],[410,260],[918,536],[581,432],[574,413],[583,187],[895,674],[316,121],[896,346],[804,239],[878,592],[177,97],[797,560],[64,56],[972,914],[902,387],[956,233],[843,126],[252,200],[719,708],[484,232],[611,409],[837,798],[851,332],[811,796],[952,526],[963,822],[468,413],[660,440],[811,74],[838,595],[942,500],[904,109],[839,214],[820,764],[829,342],[946,485],[593,160],[795,368],[562,480],[961,780],[501,84],[274,72],[403,6],[783,66],[773,221],[406,393],[957,285],[888,80],[855,657],[266,46],[745,483],[533,309],[330,165],[878,474],[480,211],[312,206],[855,1],[412,277],[881,182],[920,456],[998,362],[729,441],[815,332],[258,148],[919,88],[214,33],[993,620],[198,56],[448,48],[973,568],[662,489],[595,111],[615,228],[512,504],[704,561],[441,170],[567,467],[955,398],[874,679],[585,549],[474,180],[910,207],[813,80],[846,371],[152,120],[613,487],[424,292],[723,306],[597,368],[651,228],[908,865],[650,294],[535,516],[683,39],[895,744],[966,211],[741,265],[826,298],[140,114],[965,335],[670,268],[800,483],[832,213],[706,463],[999,910],[996,401],[737,399],[322,65],[857,371],[939,115],[518,347],[422,170],[557,214],[915,811],[969,160],[844,157],[923,670],[503,497],[745,343],[685,83],[874,658],[290,223],[487,224],[735,61],[380,236],[586,490],[946,341],[456,5],[754,225],[513,402],[843,364],[940,331],[420,193],[207,189],[716,24],[862,718],[583,380],[633,355],[976,847],[322,309],[769,535],[249,163],[814,534],[529,408],[987,823],[964,542],[806,312],[934,371],[799,718],[361,169],[932,40],[544,0],[366,363],[794,682],[679,58],[641,622],[824,747],[949,850],[685,125],[749,726],[547,421],[729,206],[839,166],[770,111],[995,87],[732,644],[323,9],[485,374],[257,192],[694,37],[486,356],[564,235],[668,177],[881,551],[378,11],[920,367],[974,780],[948,921],[850,517],[963,483],[728,643],[648,548],[440,345],[837,706],[689,457],[723,150],[870,257],[994,897],[625,119],[625,467],[785,401],[194,109],[578,181],[749,114],[506,305],[733,228],[791,382],[338,200],[983,268],[742,291],[226,69],[900,2],[200,5],[945,525],[865,267],[786,581],[841,754],[932,375],[479,284],[759,685],[678,73],[536,175],[899,456],[730,171],[847,338],[829,46],[412,199],[550,17],[599,487],[970,63],[446,419],[412,344],[867,671],[505,22],[270,190],[731,351],[889,82],[816,211],[873,269],[638,327],[920,635],[932,208],[788,141],[789,324],[602,224],[258,177],[656,499],[577,292],[934,570],[317,164],[47,45],[345,290],[723,710],[992,501],[935,815],[979,749],[962,574],[481,255],[860,724],[660,471],[912,387],[253,199],[584,528],[386,280],[736,426],[832,312],[917,820],[759,510],[430,176],[747,719],[312,243],[777,511],[674,274],[911,277],[803,31],[617,305],[810,537],[770,574],[794,590],[551,92],[604,403],[459,157],[950,114],[470,380],[201,7],[486,214],[860,470],[560,21],[671,296],[629,76],[400,118],[822,584],[348,23],[909,303],[417,245],[825,148],[871,308],[566,309],[976,530],[230,128],[238,3],[685,177],[556,134],[471,223],[717,420],[970,679],[714,551],[163,79],[620,179],[733,425],[965,128],[708,319],[706,353],[608,145],[522,6],[503,354],[677,640],[600,212],[682,620],[153,29],[951,592],[562,202],[801,536],[804,621],[777,292],[985,684],[449,25],[753,488],[482,375],[430,394],[749,197],[565,158],[789,603],[929,117],[907,248],[766,492],[713,624],[451,421],[500,105],[872,573],[751,320],[855,807],[538,359],[345,115],[525,451],[726,442],[812,441],[936,861],[775,338],[388,157],[290,61],[739,328],[893,837],[977,568],[483,0],[539,125],[887,595],[831,601],[798,336],[800,119],[398,189],[570,253],[881,363],[925,283],[407,284],[457,256],[730,17],[845,610],[972,696],[761,12],[219,100],[497,178],[970,615],[336,235],[671,218],[669,216],[511,106],[721,96],[509,106],[850,771],[753,32],[668,301],[896,739],[141,38],[803,727],[868,627],[633,501],[766,82],[707,181],[648,47],[342,270],[940,287],[992,765],[635,485],[408,83],[569,432],[887,696],[499,269],[614,612],[873,158],[626,218],[425,3],[847,525],[920,190],[692,324],[787,777],[958,763],[166,99],[970,193],[816,566],[814,688],[930,880],[752,643],[794,661],[704,650],[534,125],[185,64],[895,691],[887,168],[663,46],[979,167],[765,175],[958,815],[416,388],[485,184],[793,679],[406,339],[693,247],[174,104],[549,328],[918,560],[804,655],[813,410],[305,220],[862,779],[669,415],[557,541],[286,208],[837,768],[715,157],[601,541],[527,386],[964,428],[447,176],[791,241],[900,783],[828,531],[428,3],[428,187],[874,778],[949,833],[874,325],[899,161],[981,65],[885,185],[303,300],[638,610],[987,707],[609,124],[358,197],[849,661],[985,186],[517,165],[958,113],[551,312],[197,161],[211,175],[868,64],[742,591],[342,339],[460,72],[458,451],[992,27],[658,84],[128,80],[711,545],[889,828],[846,327],[930,656],[492,72],[748,109],[410,176],[941,488],[639,64],[857,835],[320,13],[755,421],[333,324],[280,28],[381,15],[763,357],[790,325],[465,252],[220,79],[789,103],[319,63],[691,62],[724,541],[110,80],[653,151],[497,29],[151,112],[789,122],[907,253],[715,555],[947,495],[593,423],[72,55],[900,295],[420,353],[679,641],[187,10],[515,457],[867,470],[451,232],[440,269],[472,261],[366,203],[437,187],[798,539],[711,66],[323,254],[554,257],[462,16],[504,226],[886,842],[504,402],[699,370],[867,522],[111,35],[633,540],[149,129],[221,218],[553,287],[865,416],[529,70],[160,144],[995,581],[688,409],[939,726],[615,528],[923,671],[307,104],[283,202],[591,95],[521,171],[302,148],[440,13],[486,15],[451,326],[777,326],[799,195],[396,68],[352,257],[451,387],[809,460],[912,389],[581,461],[648,205],[852,420],[770,683],[780,401],[666,164],[549,317],[444,155],[939,163],[318,240],[435,180],[397,20],[642,3],[419,181],[525,153],[828,448],[910,610],[981,466],[319,6],[81,55],[478,94],[702,379],[772,661],[235,162],[690,276],[782,333],[973,773],[870,268],[564,50],[368,342],[883,575],[996,191],[773,259],[931,427],[736,31],[866,533],[669,352],[960,60],[862,62],[561,233],[470,90],[999,482],[672,541],[881,351],[800,67],[616,396],[814,803],[870,249],[794,592],[727,356],[401,265],[958,283],[860,250],[706,439],[611,210],[868,69],[530,178],[286,48],[621,203],[922,358],[447,328],[789,129],[141,65],[848,727],[363,90],[75,54],[990,294],[623,130],[938,266],[680,10],[990,675],[345,68],[765,518],[201,61],[780,163],[960,480],[650,208],[713,78],[843,47],[300,279],[805,35],[609,119],[466,365],[687,326],[902,55],[955,875],[347,192],[928,772],[776,6],[967,924],[626,319],[860,63],[826,443],[772,763],[293,185],[999,569],[483,473],[708,356],[85,9],[966,146],[923,818],[757,505],[749,521],[779,442],[869,640],[395,239],[506,89],[600,459],[581,53],[813,772],[978,882],[886,686],[769,725],[668,237],[102,63],[946,275],[816,599],[695,389],[291,69],[355,90],[632,178],[362,1],[460,143],[499,231],[995,562],[688,206],[417,297],[588,392],[775,304],[564,376],[888,184],[988,80],[145,76],[401,177],[710,503],[612,206],[820,516],[145,65],[956,144],[181,170],[890,300],[696,579],[688,338],[870,712],[690,312],[903,635],[350,4],[369,236],[748,610],[950,353],[717,247],[264,41],[387,1],[635,334],[561,293],[823,713],[929,195],[449,290],[915,449],[726,535],[98,63],[919,122],[859,506],[901,234],[803,709],[893,257],[515,171],[580,213],[354,277],[869,506],[948,735],[997,50],[260,170],[495,76],[304,37],[426,213],[793,79],[725,215],[319,207],[866,494],[600,280],[992,82],[561,411],[939,586],[493,183],[792,360],[785,299],[924,107],[619,528],[444,215],[505,77],[841,502],[758,602],[411,159],[997,816],[775,639],[919,49],[835,788],[861,380],[920,298],[414,138],[980,636],[909,101],[825,749],[783,774],[561,508],[991,549],[693,643],[461,11],[393,73],[956,527],[284,0],[955,216],[791,481],[477,309],[715,278],[789,507],[735,401],[842,565],[69,50],[546,382],[911,727],[526,201],[74,25],[518,419],[830,323],[986,394],[984,534],[585,351],[262,51],[824,535],[843,814],[856,257],[929,449],[848,108],[923,167],[933,143],[981,412],[799,507],[949,504],[644,283],[544,389],[184,84],[854,68],[962,956],[922,888],[695,127],[806,582],[845,808],[945,551],[964,697],[446,215],[961,340],[880,656],[502,291],[909,438],[771,557],[846,228],[871,776],[923,176],[543,157],[706,85],[883,584],[649,279],[787,363],[342,317],[301,239],[873,385],[499,115],[357,76],[969,465],[282,149],[667,200],[672,471],[756,15],[860,172],[637,301],[934,833],[540,210],[547,209],[727,255],[189,187],[962,865],[623,306],[497,303],[844,289],[723,646],[394,343],[943,280],[959,0],[436,291],[762,429],[613,45],[828,569],[392,127],[556,356],[512,189],[349,114],[722,25],[449,197],[913,503],[865,96],[679,392],[693,485],[824,159],[471,374],[62,44],[654,591],[313,185],[880,549],[414,52],[734,465],[928,312],[437,22],[953,722],[254,66],[946,589],[382,272],[935,703],[948,440],[448,200],[380,63],[986,828],[672,171],[255,21],[752,406],[932,457],[339,154],[769,605],[780,418],[217,60],[971,729],[383,244],[847,551],[720,200],[961,685],[641,225],[826,92],[651,517],[728,590],[979,326],[293,227],[976,86],[582,125],[746,329],[540,151],[853,777],[924,697],[629,410],[687,40],[878,98],[708,396],[136,54],[267,197],[717,516],[417,327],[764,695],[772,282],[225,95],[963,430],[599,279],[692,365],[873,670],[534,308],[251,103],[992,566],[643,573],[265,103],[886,609],[792,532],[872,193],[687,478],[205,189],[921,284],[733,571],[302,200],[988,879],[272,38],[417,53],[782,555],[495,492],[231,196],[883,186],[997,261],[871,522],[809,264],[564,157],[789,111],[803,268],[489,203],[400,27],[252,154],[514,398],[432,170],[940,487],[165,135],[655,226],[652,150],[857,673],[441,309],[655,282],[217,70],[552,54],[722,387],[603,380],[650,224],[669,196],[614,35],[727,26],[725,466],[952,105],[861,682],[826,594],[860,354],[956,884],[887,307],[355,279],[625,350],[851,710],[728,562],[158,19],[994,6],[413,214],[740,519],[628,76],[347,119],[999,896],[807,448],[659,616],[483,193],[598,448],[701,505],[404,320],[421,125],[583,255],[946,225],[213,92],[742,704],[222,175],[956,727],[974,191],[354,47],[490,276],[326,87],[881,555],[562,251],[665,91],[528,3],[856,203],[435,15],[544,166],[856,686],[910,627],[638,191],[608,362],[945,194],[775,394],[991,638],[798,374],[23,1],[839,59],[640,390],[597,197],[539,348],[875,61],[714,538],[842,665],[767,404],[577,520],[999,5],[944,93],[466,384],[497,454],[961,273],[133,71],[980,198],[522,376],[275,233],[850,160],[753,536],[546,141],[877,594],[854,536],[521,372],[980,785],[536,414],[980,855],[700,694],[443,212],[156,72],[421,274],[800,212],[986,183],[787,745],[437,127],[230,163],[650,576],[922,388],[279,47],[992,603],[615,95],[971,164],[965,67],[626,285],[867,301],[602,48],[467,338],[995,706],[51,10],[894,272],[498,467],[532,342],[776,655],[107,67],[511,162],[248,176],[886,883],[866,682],[834,728],[893,393],[995,880],[792,568],[401,220],[949,946],[853,368],[395,54],[823,216],[514,15],[374,205],[433,248],[906,850],[440,110],[995,142],[587,106],[656,224],[409,357],[857,30],[899,237],[330,117],[524,359],[261,126],[426,152],[917,425],[834,528],[240,44],[868,391],[349,243],[561,557],[920,601],[830,283],[736,294],[958,179],[943,117],[640,271],[415,71],[615,82],[794,547],[944,285],[939,354],[777,662],[687,420],[865,783],[926,67],[836,313],[797,98],[492,388],[580,553],[730,413],[875,625],[676,557],[435,10],[373,277],[176,37],[938,795],[311,86],[684,472],[149,140],[721,79],[893,396],[147,29],[861,603],[631,290],[483,129],[429,142],[352,85],[940,85],[467,111],[817,727],[866,370],[381,192],[429,101],[699,271],[857,236],[955,110],[933,292],[802,59],[990,713],[780,10],[483,231],[578,176],[706,83],[623,321],[897,722],[999,285],[366,289],[193,24],[100,87],[912,210],[310,146],[403,262],[196,6],[364,317],[469,178],[604,186],[752,155],[708,80],[929,599],[610,340],[409,304],[804,437],[299,101],[709,91],[159,94],[887,816],[941,166],[950,887],[636,612],[987,837],[552,256],[864,134],[458,372],[673,186],[949,260],[783,535],[854,287],[839,101],[873,770],[410,335],[946,702],[699,493],[522,154],[595,57],[404,228],[872,501],[515,270],[617,188],[539,318],[895,282],[808,138],[237,36],[453,381],[756,91],[706,216],[603,194],[199,41],[775,313],[936,762],[542,429],[764,191],[748,626],[626,343],[941,18],[967,493],[750,551],[725,661],[831,656],[795,526],[427,85],[805,158],[644,453],[761,264],[172,170],[948,785],[708,665],[567,84],[732,552],[972,368],[978,290],[413,324],[925,389],[842,86],[463,257],[917,151],[413,110],[732,613],[678,251],[174,100],[838,805],[681,210],[885,466],[924,880],[501,489],[145,62],[745,534],[973,80],[125,18],[412,8],[476,431],[833,283],[791,54],[500,304],[321,145],[730,281],[508,156],[863,139],[727,197],[537,492],[861,31],[828,184],[195,98],[670,34],[920,385],[805,458],[763,647],[837,441],[894,220],[574,508],[688,51],[681,433],[683,408],[704,342],[891,215],[922,496],[655,438],[768,646],[728,74],[830,572],[865,351],[928,396],[645,540],[647,488],[232,124],[785,279],[39,4],[451,432],[726,531],[824,219],[924,343],[902,21],[632,255],[877,260],[619,171],[201,35],[63,12],[559,540],[736,316],[735,485],[327,85],[396,85],[468,335],[612,565],[139,95],[603,526],[526,60],[958,913],[837,785],[897,317],[852,456],[822,251],[373,150],[65,54],[320,239],[909,115],[853,25],[755,310],[795,414],[529,269],[625,593],[776,101],[977,350],[779,664],[540,233],[853,714],[421,19],[879,480],[383,109],[915,102],[423,85],[629,129],[800,92],[340,138],[972,929],[519,423],[552,143],[987,978],[645,7],[188,30],[828,11],[858,796],[882,564],[486,253],[244,168],[826,696],[328,92],[467,242],[963,11],[627,416],[527,434],[920,607],[522,210],[527,38],[438,327],[256,136],[370,357],[950,169],[767,559],[998,0],[999,619],[887,798],[546,443],[934,58],[843,507],[827,203],[852,130],[649,45],[641,289],[410,313],[867,639],[488,461],[696,516],[628,133],[702,410],[225,108],[647,335],[603,390],[922,412],[657,654],[844,188],[884,865],[823,666],[580,345],[933,908],[337,115],[882,231],[949,214],[995,714],[757,156],[617,505],[399,206],[502,141],[661,171],[297,211],[873,291],[896,553],[892,89],[699,316],[571,59],[666,446],[646,129],[921,234],[986,916],[568,171],[690,291],[596,214],[745,625],[913,546],[379,169],[512,216],[709,575],[748,615],[289,110],[915,776],[355,36],[950,641],[775,216],[604,272],[709,86],[633,430],[197,52],[699,494],[622,428],[670,646],[336,312],[423,79],[872,748],[800,360],[984,419],[885,342],[595,534],[461,451],[626,323],[516,332],[892,809],[794,371],[663,19],[446,145],[892,838],[997,774],[761,158],[750,437],[911,103],[924,533],[948,842],[941,480],[357,79],[999,240],[705,417],[329,42],[398,239],[428,140],[637,536],[521,417],[650,336],[962,931],[415,76],[910,779],[802,32],[780,620],[911,656],[751,570],[695,140],[702,189],[699,194],[693,533],[745,6],[912,529],[321,107],[654,414],[704,350],[692,129],[468,226],[900,216],[401,397],[787,167],[974,785],[244,156],[800,169],[795,235],[947,220],[730,708],[160,84],[842,387],[532,214],[776,292],[553,159],[944,181],[768,535],[949,84],[690,373],[614,121],[816,713],[50,42],[742,70],[602,168],[574,421],[606,308],[865,40],[526,301],[830,706],[604,131],[671,384],[276,89],[873,25],[802,502],[939,638],[566,355],[819,490],[507,94],[546,322],[965,721],[874,394],[533,445],[317,10],[801,647],[753,268],[829,533],[903,300],[861,135],[723,571],[208,67],[985,798],[391,85],[148,142],[717,126],[848,669],[841,291],[861,7],[944,482],[846,629],[597,76],[724,373],[524,234],[922,298],[425,174],[687,296],[793,724],[325,55],[970,462],[767,30],[861,189],[675,640],[203,48],[638,466],[996,378],[706,288],[785,58],[381,0],[844,8],[842,575],[644,330],[764,381],[727,494],[799,157],[860,433],[605,573],[910,208],[703,570],[839,700],[751,114],[128,103],[683,570],[768,455],[801,272],[814,291],[608,476],[947,112],[521,29],[796,240],[905,263],[123,119],[643,309],[881,695],[744,103],[551,241],[513,221],[487,369],[803,613],[436,419],[255,45],[344,59],[742,195],[242,1],[187,166],[576,42],[999,908],[645,480],[892,691],[976,218],[892,82],[518,286],[431,261],[660,57],[913,269],[833,504],[446,342],[576,556],[979,519],[981,859],[652,556],[583,321],[961,337],[620,51],[749,103],[857,660],[690,41],[863,572],[976,125],[618,68],[638,136],[909,759],[963,883],[859,446],[194,5],[425,77],[508,218],[532,142],[156,71],[696,78],[700,414],[859,404],[701,620],[510,255],[612,390],[628,533],[409,262],[455,179],[994,950],[707,4],[626,570],[57,3],[959,547],[918,313],[411,303],[939,91],[814,229],[430,271],[991,781],[888,121],[545,108],[794,598],[894,36],[472,206],[747,108],[903,889],[953,313],[686,599],[991,921],[344,323],[635,46],[585,13],[914,259],[807,600],[768,343],[912,717],[806,144],[983,25],[759,521],[820,382],[125,56],[761,3],[632,95],[932,66],[723,684],[298,223],[861,72],[897,513],[671,653],[742,544],[353,100],[199,100],[139,93],[784,395],[590,391],[326,224],[307,276],[445,271],[916,488],[779,637],[998,135],[868,319],[357,341],[880,618],[976,190],[893,860],[731,458],[541,188],[493,93],[593,454],[515,325],[820,178],[767,741],[787,85],[204,49],[412,355],[981,164],[332,71],[999,300],[927,768],[186,18],[630,143],[578,470],[799,323],[185,136],[493,290],[879,352],[757,509],[689,262],[373,307],[707,466],[563,42],[249,86],[793,108],[511,331],[702,456],[799,628],[967,402],[811,581],[546,518],[773,582],[905,638],[698,433],[521,245],[650,264],[913,478],[207,201],[392,236],[948,27],[328,72],[345,212],[919,392],[58,23],[761,159],[208,108],[822,339],[591,69],[880,377],[245,50],[259,129],[652,498],[505,178],[430,34],[790,143],[873,8],[811,101],[715,343],[606,535],[763,198],[558,240],[961,190],[936,655],[376,364],[361,239],[725,589],[892,215],[915,704],[945,291],[562,122],[988,353],[647,514],[973,356],[503,449],[878,771],[649,444],[849,845],[592,268],[549,508],[627,582],[757,287],[870,529],[713,141],[759,598],[422,31],[928,20],[782,714],[835,360],[480,64],[630,182],[530,39],[498,185],[915,244],[536,176],[831,29],[633,304],[817,810],[780,191],[697,209],[596,470],[426,334],[547,315],[947,277],[957,719],[725,552],[853,747],[244,196],[897,255],[983,236],[577,272],[321,80],[772,360],[901,454],[662,79],[596,371],[871,683],[908,473],[935,200],[666,584],[904,143],[881,400],[762,637],[305,98],[884,479],[919,384],[522,121],[898,728],[786,147],[272,118],[535,24],[898,598],[662,519],[763,236],[436,287],[536,514],[857,770],[755,535],[914,471],[227,22],[960,522],[647,337],[991,130],[497,208],[292,226],[999,954],[307,179],[119,105],[770,442],[493,236],[817,768],[524,244],[591,309],[605,278],[57,10],[695,268],[813,6],[738,729],[92,38],[499,99],[872,702],[155,152],[464,176],[952,649],[387,16],[846,623],[689,618],[596,136],[137,38],[608,262],[971,958],[644,230],[997,303],[413,356],[836,204],[847,395],[982,200],[809,300],[913,365],[777,491],[800,790],[622,166],[742,0],[744,65],[769,628],[557,485],[769,88],[621,279],[945,714],[760,615],[804,725],[943,174],[969,118],[532,61],[721,102],[843,252],[452,273],[689,578],[617,501],[662,143],[794,680],[295,21],[477,418],[786,84],[132,87],[511,320],[452,39],[947,800],[521,271],[629,178],[978,597],[415,253],[728,306],[728,112],[904,898],[707,616],[574,178],[805,134],[819,702],[272,214],[821,92],[543,422],[230,30],[204,6],[570,387],[500,133],[974,145],[763,509],[741,425],[740,196],[569,5],[928,286],[484,370],[948,378],[718,693],[383,133],[524,100],[475,413],[342,60],[703,624],[967,561],[623,274],[776,734],[513,480],[350,168],[969,784],[607,5],[265,34],[208,68],[403,17],[919,504],[930,625],[726,200],[834,61],[710,341],[355,218],[915,99],[754,457],[816,689],[648,210],[329,291],[454,45],[541,42],[549,289],[692,633],[652,152],[885,725],[785,199],[884,764],[690,177],[977,315],[605,489],[777,324],[825,437],[674,485],[539,487],[495,46],[733,386],[874,550],[937,567],[410,71],[676,497],[903,577],[843,181],[992,519],[936,786],[664,194],[573,370],[868,284],[267,213],[407,405],[915,681],[992,850],[818,292],[975,660],[642,129],[574,37],[583,268],[991,315],[831,709],[412,46],[797,631],[999,304],[849,411],[701,131],[752,687],[355,58],[882,20],[993,290],[958,0],[927,712],[517,67],[951,393],[465,99],[464,278],[667,151],[603,571],[725,671],[586,151],[467,402],[404,35],[475,43],[623,478],[438,99],[607,176],[592,48],[912,493],[676,27],[334,113],[325,320],[622,205],[663,145],[886,159],[752,574],[876,211],[663,638],[869,431],[809,765],[818,362],[245,179],[205,113],[637,67],[474,245],[904,294],[141,2],[937,213],[674,172],[961,495],[516,342],[807,690],[923,366],[706,510],[517,50],[332,95],[817,671],[408,313],[563,526],[218,141],[768,278],[906,1],[993,811],[629,318],[922,306],[863,350],[496,107],[981,299],[849,833],[802,101],[899,725],[922,619],[715,319],[875,152],[889,823],[590,346],[979,2],[508,189],[783,757],[560,253],[830,326],[865,9],[345,4],[473,461],[921,471],[501,325],[700,526],[359,35],[115,65],[943,344],[787,202],[766,231],[952,773],[836,232],[853,364],[363,58],[958,460],[459,47],[479,382],[627,294],[692,511],[635,155],[839,335],[901,398],[397,180],[534,152],[548,210],[942,73],[883,313],[922,329],[972,634],[681,648],[491,270],[919,698],[565,71],[866,63],[906,838],[486,69],[997,723],[371,88],[374,371],[944,869],[373,178],[623,556],[687,38],[431,216],[685,232],[904,192],[691,379],[456,372],[717,696],[713,573],[376,238],[966,258],[231,188],[278,28],[759,439],[506,332],[716,432],[475,381],[340,232],[862,579],[391,32],[453,291],[991,574],[702,56],[775,221],[997,378],[469,249],[794,770],[907,880],[450,84],[889,195],[555,135],[223,137],[218,152],[109,27],[206,98],[766,50],[575,177],[878,326],[467,70],[709,590],[72,3],[828,800],[518,188],[711,565],[774,738],[425,12],[893,76],[622,479],[744,7],[987,374],[654,40],[360,346],[598,382],[381,113],[854,314],[573,16],[856,150],[914,144],[642,176],[584,299],[856,471],[777,243],[624,156],[277,255],[830,452],[878,33],[566,483],[915,671],[162,148],[881,353],[688,413],[778,155],[372,245],[772,138],[346,246],[642,344],[468,96],[769,723],[774,58],[255,80],[329,191],[232,114],[991,904],[809,399],[625,18],[579,326],[503,440],[668,123],[94,81],[471,177],[764,423],[626,177],[541,222],[861,150],[746,424],[984,212],[418,408],[152,129],[505,4],[943,582],[860,186],[816,301],[350,147],[350,295],[688,542],[200,122],[843,233],[808,507],[963,475],[546,155],[830,556],[285,224],[839,323],[888,353],[697,581],[891,240],[781,412],[965,765],[783,231],[435,223],[830,806],[532,6],[952,464],[773,212],[615,27],[823,470],[890,84],[683,421],[807,767],[133,115],[50,32],[642,137],[617,439],[913,639],[903,763],[273,231],[808,272],[796,440],[436,0],[914,856],[822,376],[762,651],[621,397],[992,853],[106,19],[530,287],[725,284],[885,852],[634,413],[178,132],[685,166],[986,116],[773,330],[639,196],[242,92],[987,353],[362,212],[410,100],[504,502],[424,63],[839,116],[681,156],[568,68],[328,196],[980,283],[738,347],[992,743],[561,514],[669,623],[573,29],[774,594],[722,665],[957,444],[674,601],[999,51],[967,754],[448,184],[825,320],[990,111],[725,632],[709,82],[155,74],[624,132],[657,208],[873,795],[756,364],[856,531],[707,30],[978,267],[651,282],[902,384],[975,914],[597,460],[966,378],[598,310],[448,95],[825,175],[875,75],[899,2],[518,122],[889,600],[732,721],[670,445],[475,272],[996,684],[765,455],[881,114],[602,527],[900,632],[293,139],[99,76],[493,467],[605,430],[729,342],[915,145],[954,172],[940,931],[661,63],[932,191],[894,158],[786,371],[675,38],[450,306],[483,205],[630,128],[442,21],[569,496],[433,329],[370,272],[873,143],[634,408],[537,254],[566,221],[385,281],[696,570],[383,79],[843,705],[350,6],[698,213],[953,465],[460,92],[346,183],[588,576],[859,800],[429,299],[535,521],[140,132],[455,147],[906,190],[726,545],[406,21],[493,50],[555,320],[289,200],[959,665],[800,644],[791,142],[676,63],[615,562],[951,571],[417,35],[552,269],[768,12],[514,373],[968,658],[918,262],[679,550],[511,123],[422,90],[404,223],[718,367],[350,69],[657,385],[791,365],[919,334],[969,788],[572,292],[85,46],[612,300],[875,400],[938,539],[748,159],[900,158],[508,507],[934,600],[957,18],[787,557],[813,308],[692,54],[649,184],[929,95],[299,45],[332,121],[495,26],[773,504],[730,151],[487,108],[854,332],[950,899],[500,252],[428,417],[519,137],[277,140],[900,455],[333,163],[687,330],[819,227],[972,595],[513,22],[843,7],[710,152],[965,914],[441,199],[910,424],[867,510],[594,494],[560,322],[495,175],[786,402],[774,641],[920,350],[676,262],[852,181],[926,157],[378,86],[668,612],[669,492],[908,277],[884,134],[793,757],[964,49],[166,34],[359,158],[780,153],[739,236],[265,64],[536,222],[937,167],[170,16],[62,54],[423,325],[861,719],[791,278],[652,124],[792,43],[888,309],[931,900],[894,697],[678,457],[947,84],[601,272],[643,557],[648,535],[892,161],[642,239],[859,374],[601,553],[810,41],[894,879],[743,664],[945,462],[594,327],[42,13],[176,47],[546,132],[405,185],[649,449],[329,311],[403,21],[943,680],[855,302],[318,16],[558,9],[877,29],[763,373],[874,671],[789,100],[433,74],[691,108],[390,248],[741,322],[696,173],[987,637],[517,284],[788,44],[629,243],[227,203],[766,67],[553,323],[482,295],[813,173],[775,256],[588,552],[569,263],[114,37],[681,39],[936,913],[598,508],[883,346],[831,71],[991,436],[161,24],[652,101],[751,450],[558,444],[565,229],[938,752],[930,68],[290,271],[418,300],[474,328],[887,35],[807,178],[859,330],[990,715],[870,320],[523,462],[448,381],[725,439],[206,131],[931,434],[610,564],[385,180],[874,268],[718,209],[518,311],[534,476],[990,344],[926,137],[656,17],[707,239],[541,135],[724,122],[853,199],[318,235],[646,414],[942,878],[779,705],[973,67],[942,545],[268,234],[268,235],[547,266],[813,306],[892,337],[688,603],[362,3],[445,429],[800,402],[736,611],[987,4],[946,625],[882,519],[834,166],[738,425],[905,94],[621,23],[563,59],[232,139],[805,100],[855,754],[813,380],[975,893],[895,771],[180,131],[797,657],[307,218],[971,850],[878,245],[315,84],[543,503],[562,79],[845,2],[838,488],[585,565],[827,748],[436,201],[604,143],[914,159],[414,254],[505,306],[949,156],[612,201],[999,787],[925,788],[773,224],[985,152],[954,472],[883,151],[659,278],[531,21],[595,135],[298,266],[695,368],[421,121],[667,121],[181,107],[567,359],[823,407],[596,571],[997,103],[388,272],[974,232],[842,30],[723,318],[448,447],[489,132],[398,394],[446,397],[921,172],[684,502],[113,111],[904,72],[776,255],[507,394],[729,319],[925,166],[163,131],[966,432],[381,260],[853,178],[724,490],[735,75],[513,267],[933,503],[36,22],[848,125],[817,684],[209,195],[978,42],[646,241],[687,230],[992,403],[965,689],[664,151],[250,249],[898,386],[527,374],[580,478],[695,144],[276,37],[903,340],[543,399],[231,113],[554,181],[810,746],[463,96],[485,276],[341,77],[930,268],[323,235],[295,108],[206,11],[987,699],[605,277],[903,695],[635,60],[844,25],[903,366],[644,520],[253,144],[400,324],[439,351],[946,364],[920,273],[868,749],[876,478],[497,397],[416,304],[192,150],[906,342],[94,18],[137,1],[719,226],[978,120],[879,207],[458,39],[947,110],[806,421],[754,616],[704,388],[682,123],[559,496],[800,189],[126,95],[781,688],[934,773],[936,556],[473,315],[252,234],[786,316],[577,397],[344,107],[797,395],[807,127],[802,599],[669,608],[882,5],[808,592],[897,7],[640,411],[686,383],[974,918],[646,465],[595,186],[902,413],[744,725],[378,296],[521,187],[921,128],[836,312],[949,462],[541,458],[699,488],[633,527],[801,358],[822,290],[996,824],[896,491],[40,25],[557,22],[983,170],[695,106],[712,422],[269,220],[410,356],[626,193],[846,817],[524,283],[249,97],[927,347],[931,832],[200,32],[256,70],[188,78],[672,223],[507,258],[582,2],[897,369],[978,788],[191,51],[515,181],[931,767],[799,559],[273,12],[720,188],[508,146],[771,11],[960,321],[284,2],[423,283],[472,301],[934,254],[333,66],[607,568],[707,313],[701,25],[768,261],[611,229],[364,75],[192,70],[634,249],[824,486],[745,700],[989,882],[651,238],[521,229],[526,179],[667,350],[730,6],[402,388],[353,143],[685,39],[961,131],[708,355],[533,71],[671,542],[920,519],[919,559],[933,635],[776,297],[354,298],[86,57],[966,919],[790,694],[949,287],[488,460],[993,828],[216,140],[925,617],[637,191],[798,20],[589,375],[846,335],[864,638],[855,256],[642,320],[486,123],[721,503],[884,369],[956,294],[662,644],[328,179],[842,180],[493,152],[550,281],[279,268],[554,322],[440,352],[964,786],[976,371],[374,245],[833,693],[416,152],[326,88],[885,148],[826,398],[432,382],[623,385],[574,50],[998,378],[646,494],[784,736],[303,175],[820,335],[599,183],[650,508],[887,860],[974,783],[916,645],[968,467],[655,205],[851,251],[547,194],[848,392],[787,715],[740,566],[784,352],[571,147],[698,362],[306,195],[983,368],[453,292],[756,553],[582,369],[544,326],[624,78],[491,413],[645,245],[722,577],[666,301],[515,318],[851,640],[567,274],[793,614],[400,358],[54,40],[976,156],[906,482],[472,209],[673,31],[353,16],[617,474],[704,130],[953,535],[889,839],[957,433],[578,457],[744,329],[799,107],[693,238],[318,196],[323,181],[670,126],[954,833],[79,60],[769,174],[711,636],[978,119],[251,93],[956,743],[999,184],[500,69],[409,290],[994,800],[546,533],[171,108],[768,42],[654,404],[669,329],[645,255],[898,498],[510,470],[790,701],[316,175],[933,466],[851,105],[233,145],[701,303],[709,214],[475,222],[602,145],[565,439],[931,57],[454,294],[943,277],[332,13],[562,1],[832,829],[221,190],[226,91],[718,712],[959,757],[608,25],[484,6],[953,363],[841,818],[429,161],[207,162],[968,603],[911,733],[917,241],[814,536],[751,348],[918,45],[891,465],[741,735],[491,250],[886,490],[224,111],[796,736],[899,469],[736,79],[580,278],[322,63],[913,618],[637,425],[517,259],[697,91],[491,363],[537,514],[469,279],[590,341],[952,751],[868,193],[944,584],[241,132],[670,534],[847,784],[268,86],[713,390],[303,261],[870,587],[960,445],[984,223],[336,94],[889,464],[852,195],[783,191],[651,56],[893,709],[266,194],[638,240],[829,106],[721,46],[158,15],[922,557],[922,375],[947,437],[916,357],[923,525],[227,59],[886,215],[590,13],[940,429],[868,701],[895,78],[784,382],[500,460],[492,169],[905,627],[944,39],[361,203],[785,485],[796,580],[923,342],[405,403],[326,185],[612,534],[396,168],[888,856],[997,492],[350,49],[381,338],[780,764],[822,149],[978,571],[731,649],[974,617],[667,310],[811,230],[620,191],[756,358],[629,104],[152,148],[523,159],[544,70],[882,126],[663,274],[978,203],[725,394],[872,234],[425,59],[410,231],[609,304],[312,26],[374,81],[299,166],[447,337],[885,646],[561,436],[922,439],[748,222],[732,416],[776,760],[547,312],[702,673],[375,28],[826,419],[761,77],[246,60],[409,42],[257,63],[905,540],[498,105],[243,64],[502,266],[518,11],[864,143],[654,289],[162,147],[787,641],[871,660],[346,58],[335,245],[634,571],[100,15],[549,105],[961,783],[924,177],[970,375],[850,163],[775,126],[665,94],[565,244],[623,282],[760,537],[431,401],[857,691],[724,699],[181,44],[793,12],[723,161],[521,110],[722,678],[660,443],[737,215],[626,354],[618,510],[406,31],[500,387],[857,341],[135,1],[515,52],[917,2],[944,68],[952,691],[644,550],[377,376],[653,317],[301,27],[766,138],[985,332],[816,70],[345,105],[525,444],[310,220],[836,592],[773,170],[244,69],[985,801],[465,140],[685,307],[847,661],[146,56],[423,381],[707,533],[635,360],[367,362],[862,574],[755,289],[327,45],[753,59],[619,515],[950,653],[701,300],[360,240],[492,138],[614,133],[406,265],[983,946],[742,200],[467,318],[324,140],[974,721],[967,537],[262,17],[138,118],[461,449],[420,178],[819,751],[339,132],[828,813],[282,143],[956,191],[710,140],[632,499],[264,173],[373,292],[767,537],[750,265],[602,339],[326,168],[898,20],[221,53],[410,137],[691,184],[975,250],[476,44],[678,99],[650,33],[783,375],[840,465],[871,422],[363,241],[743,301],[983,822],[950,504],[385,19],[623,430],[601,170],[953,554],[230,168],[304,105],[633,536],[140,138],[958,345],[794,564],[659,399],[554,238],[988,28],[522,122],[575,60],[929,233],[713,579],[949,828],[632,572],[896,552],[792,576],[571,271],[673,282],[652,279],[412,259],[308,95],[592,497],[741,415],[784,246],[948,908],[256,49],[849,337],[951,914],[809,42],[346,254],[432,157],[969,638],[506,37],[502,380],[522,423],[963,340],[914,654],[520,499],[651,216],[573,308],[647,606],[859,585],[521,452],[432,396],[944,642],[322,15],[698,529],[652,369],[932,321],[665,455],[526,53],[855,827],[444,353],[537,137],[387,74],[824,150],[722,357],[812,368],[651,223],[670,486],[372,237],[844,335],[655,222],[903,500],[918,862],[738,474],[947,386],[746,196],[480,452],[445,297],[474,270],[773,97],[675,299],[846,361],[956,636],[871,192],[507,431],[671,45],[358,35],[410,306],[310,286],[704,638],[688,492],[327,281],[335,78],[684,307],[730,517],[901,588],[785,704],[670,417],[775,713],[827,347],[714,492],[325,237],[653,454],[113,106],[699,401],[791,114],[495,109],[975,848],[321,183],[678,207],[615,384],[646,378],[881,826],[333,329],[501,433],[852,72],[758,380],[932,264],[732,627],[659,386],[891,867],[694,404],[540,281],[856,730],[907,10],[894,271],[765,272],[944,275],[856,698],[999,508],[400,241],[956,791],[429,15],[458,17],[211,162],[627,440],[576,477],[801,693],[674,526],[996,723],[662,314],[791,427],[900,218],[658,115],[908,891],[725,536],[954,836],[722,628],[672,130],[632,129],[890,217],[725,71],[997,908],[941,569],[586,50],[515,491],[668,444],[444,402],[750,386],[788,321],[690,310],[698,560],[679,627],[541,320],[685,151],[381,270],[579,308],[285,197],[936,625],[671,317],[978,719],[370,110],[632,36],[825,48],[328,130],[365,236],[781,55],[853,618],[668,466],[946,448],[798,409],[864,271],[909,123],[546,192],[693,158],[542,187],[633,78],[674,577],[669,479],[925,122],[151,77],[789,87],[599,12],[869,660],[686,67],[269,87],[746,481],[901,705],[867,775],[831,771],[11,8],[775,686],[410,209],[392,47],[438,426],[707,210],[680,248],[373,104],[637,316],[627,338],[899,42],[353,312],[168,60],[688,243],[981,862],[951,245],[629,606],[872,367],[560,523],[41,22],[813,243],[813,328],[75,0],[575,126],[274,226],[867,154],[852,40],[608,252],[815,717],[779,300],[951,490],[464,63],[808,147],[618,352],[844,80],[791,535],[83,0],[721,161],[874,73],[834,442],[747,255],[972,306],[856,160],[796,19],[694,244],[961,186],[739,97],[656,371],[927,229],[397,178],[545,180],[989,803],[501,148],[971,344],[483,248],[816,487],[241,21],[644,211],[262,137],[950,722],[505,125],[563,556],[771,740],[837,565],[491,450],[579,72],[784,209],[701,75],[758,575],[730,284],[787,320],[547,42],[799,236],[540,344],[288,59],[566,465],[789,683],[570,235],[845,829],[253,135],[924,815],[610,434],[689,268],[454,415],[937,636],[436,113],[969,22],[824,270],[806,236],[921,767],[667,586],[859,831],[791,161],[789,586],[990,627],[621,201],[985,0],[255,237],[665,114],[994,178],[985,784],[906,436],[547,45],[198,138],[849,53],[795,330],[418,99],[921,208],[562,229],[930,697],[908,900],[323,240],[890,620],[395,250],[870,358],[907,666],[816,623],[603,78],[776,601],[640,312],[978,399],[964,20],[846,115],[340,77],[876,270],[794,486],[335,217],[609,461],[540,428],[298,9],[743,721],[592,50],[934,275],[691,94],[776,736],[196,98],[561,373],[828,541],[100,39],[582,293],[965,98],[982,98],[733,440],[897,138],[579,61],[659,222],[796,501],[558,524],[818,651],[993,175],[962,463],[242,75],[620,94],[303,293],[990,773],[788,671],[411,276],[552,291],[627,303],[776,583],[792,149],[520,97],[844,126],[510,218],[788,680],[585,238],[362,193],[498,112],[926,495],[832,522],[691,35],[836,42],[711,371],[979,280],[460,337],[888,725],[936,50],[919,769],[692,426],[356,157],[387,187],[582,563],[462,160],[500,52],[763,88],[614,131],[914,288],[944,36],[950,623],[638,282],[592,86],[965,157],[481,450],[804,267],[745,408],[421,383],[774,9],[819,769],[440,390],[885,553],[526,349],[719,72],[942,879],[784,723],[398,168],[484,132],[749,229],[710,75],[875,265],[529,47],[747,529],[374,275],[698,389],[276,234],[826,724],[914,573],[631,124],[377,266],[747,722],[646,590],[789,450],[794,82],[962,534],[801,758],[933,648],[921,309],[931,851],[744,413],[880,736],[555,369],[756,175],[978,164],[839,111],[222,41],[230,181],[581,150],[499,278],[778,615],[987,515],[580,502],[324,118],[176,39],[929,16],[758,334],[832,206],[277,142],[772,224],[783,132],[992,299],[702,113],[526,429],[669,463],[821,345],[756,147],[124,31],[878,181],[763,664],[653,82],[656,314],[529,475],[644,635],[653,4],[407,155],[878,851],[728,616],[728,254],[775,392],[874,606],[900,40],[758,52],[749,714],[361,132],[784,89],[617,492],[930,309],[622,67],[625,150],[884,602],[813,321],[771,147],[900,241],[667,527],[921,704],[536,151],[453,327],[614,599],[879,27],[579,107],[470,281],[504,46],[869,228],[709,282],[680,162],[317,286],[687,642],[778,53],[210,129],[751,26],[453,181],[949,749],[689,204],[894,217],[37,14],[848,592],[992,293],[992,673],[603,590],[698,298],[894,25],[675,673],[320,215],[640,164],[948,863],[324,299],[788,214],[339,311],[664,395],[720,218],[222,26],[445,339],[673,511],[937,854],[518,508],[861,705],[241,224],[915,392],[298,165],[792,738],[937,700],[931,266],[601,481],[570,335],[884,881],[556,184],[469,388],[727,59],[181,61],[943,757],[768,661],[560,6],[871,550],[883,305],[239,49],[314,74],[827,168],[669,112],[353,81],[697,4],[661,477],[367,92],[830,764],[901,269],[685,131],[936,156],[957,757],[449,105],[394,42],[232,156],[270,242],[959,552],[563,441],[801,667],[330,275],[952,896],[854,423],[941,586],[657,540],[998,849],[403,266],[761,111],[864,31],[542,529],[46,4],[539,81],[820,171],[678,61],[699,467],[137,128],[945,500],[587,200],[643,363],[870,674],[707,578],[769,484],[802,386],[962,912],[815,730],[567,174],[750,692],[825,529],[749,701],[709,221],[848,72],[921,13],[824,516],[508,102],[408,145],[935,800],[380,229],[866,52],[284,187],[390,342],[520,229],[449,180],[927,663],[933,790],[929,248],[355,336],[549,120],[415,353],[802,255],[480,389],[975,953],[770,396],[308,301],[495,232],[648,359],[666,48],[602,73],[395,350],[589,35],[901,478],[818,631],[998,832],[489,162],[694,459],[852,513],[977,99],[902,29],[684,584],[536,214],[827,114],[895,579],[809,805],[773,426],[795,633],[935,694],[853,292],[916,352],[246,113],[875,593],[871,632],[969,317],[672,421],[478,156],[652,449],[794,119],[237,28],[545,252],[565,101],[941,45],[389,114],[753,417],[692,425],[798,38],[569,442],[294,69],[847,677],[820,439],[417,196],[73,22],[307,112],[255,249],[515,214],[720,711],[790,757],[893,81],[982,369],[849,577],[806,696],[221,157],[863,202],[746,207],[917,175],[329,49],[563,489],[873,433],[723,118],[650,164],[177,13],[401,400],[851,295],[154,129],[266,57],[929,122],[681,20],[679,637],[870,41],[969,92],[946,476],[980,433],[235,103],[902,349],[772,306],[786,166],[92,29],[475,42],[515,144],[631,623],[74,8],[824,269],[957,92],[400,250],[477,415],[728,452],[784,258],[111,92],[595,7],[843,659],[985,914],[725,262],[778,682],[660,448],[507,299],[250,179],[282,266],[941,688],[778,435],[837,27],[269,10],[930,661],[601,256],[991,645],[32,24],[698,601],[971,422],[994,628],[960,223],[521,475],[917,592],[418,264],[921,895],[506,383],[715,485],[602,350],[776,267],[415,83],[750,476],[548,342],[910,633],[604,269],[543,350],[405,252],[433,89],[496,158],[767,438],[496,475],[701,503],[998,43],[482,473],[870,852],[392,153],[624,276],[882,548],[715,335],[552,158],[829,580],[489,167],[838,521],[760,78],[903,670],[692,337],[868,733],[504,449],[674,459],[890,659],[805,164],[767,600],[976,305],[990,140],[726,541],[275,171],[798,132],[487,5],[548,1],[727,576],[815,574],[821,71],[400,282],[316,142],[720,237],[885,41],[218,193],[122,81],[849,751],[278,97],[406,79],[635,561],[498,303],[902,243],[957,826],[572,11],[434,102],[984,613],[884,584],[424,255],[754,292],[921,231],[384,103],[743,145],[505,48],[100,53],[785,709],[677,353],[949,859],[720,195],[897,260],[900,756],[708,336],[631,136],[966,295],[458,344],[825,30],[559,487],[394,209],[718,22],[821,751],[852,791],[276,270],[909,774],[847,370],[818,112],[805,637],[849,484],[823,97],[988,922],[220,91],[459,414],[639,179],[866,309],[449,263],[583,377],[764,745],[652,99],[890,327],[482,3],[533,285],[904,836],[202,104],[880,56],[197,59],[319,311],[907,751],[872,443],[665,635],[495,325],[265,262],[890,189],[338,325],[945,224],[993,283],[912,887],[921,163],[530,250],[382,320],[603,355],[343,249],[686,483],[433,112],[369,217],[402,14],[918,380],[151,102],[434,161],[605,583],[248,16],[829,435],[366,164],[384,25],[378,118],[885,681],[567,368],[767,443],[190,134],[938,181],[370,2],[821,411],[643,452],[884,38],[740,183],[574,291],[920,493],[797,708],[999,745],[781,332],[584,295],[766,562],[411,239],[829,19],[159,103],[929,353],[976,462],[894,744],[571,374],[823,72],[779,661],[940,437],[329,22],[385,23],[556,383],[751,190],[927,577],[443,255],[858,400],[533,113],[720,5],[291,194],[359,221],[953,196],[323,250],[365,122],[506,23],[631,39],[963,792],[576,323],[828,152],[948,760],[448,192],[984,887],[950,204],[742,658],[291,126],[419,303],[327,103],[280,178],[766,703],[990,134],[825,427],[372,264],[218,18],[956,454],[924,375],[662,576],[829,469],[752,517],[435,371],[265,208],[846,610],[973,118],[620,113],[514,430],[922,105],[838,478],[946,284],[692,169],[671,193],[283,53],[477,270],[508,193],[913,125],[757,430],[975,402],[972,784],[702,136],[736,77],[951,382],[858,525],[877,344],[765,487],[957,374],[588,32],[815,595],[999,342],[176,117],[462,96],[745,96],[648,474],[827,413],[996,661],[836,720],[682,664],[330,105],[696,197],[368,178],[842,800],[928,145],[631,0],[426,237],[972,830],[710,129],[961,473],[487,469],[738,493],[429,107],[276,143],[492,48],[774,33],[716,15],[717,666],[492,450],[489,450],[746,611],[803,160],[992,508],[873,574],[376,89],[658,307],[631,579],[325,259],[724,185],[405,0],[848,264],[518,400],[748,355],[774,760],[993,386],[596,337],[629,331],[362,153],[993,858],[772,400],[743,218],[827,602],[586,575],[860,237],[991,239],[894,537],[842,591],[534,403],[476,148],[921,594],[873,621],[869,580],[151,13],[366,159],[592,47],[520,64],[551,198],[822,476],[979,213],[890,683],[995,4],[804,508],[521,394],[943,317],[804,47],[297,154],[94,90],[824,363],[942,445],[452,399],[328,232],[375,179],[143,46],[873,762],[537,70],[444,22],[170,121],[655,600],[752,143],[766,400],[802,695],[471,299],[690,349],[544,508],[809,531],[924,788],[735,489],[880,61],[734,686],[415,268],[312,292],[954,378],[667,466],[460,352],[30,6],[717,384],[541,476],[930,293],[941,511],[667,488],[797,433],[751,330],[789,764],[975,232],[136,124],[854,744],[716,674],[590,584],[936,401],[580,86],[111,8],[685,126],[852,85],[795,608],[775,626],[825,58],[989,437],[887,424],[858,526],[744,4],[763,729],[915,660],[965,680],[500,113],[981,943],[877,791],[683,612],[391,312],[475,104],[843,167],[567,310],[538,525],[948,388],[835,206],[550,396],[994,318],[851,0],[923,506],[484,162],[687,216],[722,53],[550,154],[435,266],[473,238],[831,654],[366,134],[577,327],[990,740],[414,298],[648,306],[286,82],[854,830],[952,279],[698,62],[250,29],[288,249],[365,138],[582,39],[934,835],[624,151],[561,469],[949,372],[437,358],[810,596],[723,465],[984,585],[647,346],[589,389],[668,281],[978,206],[383,72],[832,768],[617,512],[994,320],[193,110],[422,11],[652,1],[646,259],[644,382],[863,313],[961,847],[926,419],[348,312],[513,443],[540,26],[882,692],[947,627],[477,403],[945,443],[315,267],[332,78],[512,221],[859,462],[386,12],[922,476],[675,357],[919,757],[397,101],[791,425],[428,173],[783,235],[671,293],[965,228],[273,179],[889,887],[422,125],[870,227],[382,104],[742,380],[967,772],[666,335],[786,5],[601,281],[560,89],[405,149],[911,210],[972,390],[390,329],[797,255],[215,68],[874,348],[633,361],[989,648],[860,506],[997,527],[809,562],[936,621],[964,608],[526,42],[387,69],[325,153],[997,995],[272,95],[803,57],[795,666],[478,250],[650,120],[929,133],[863,143],[900,371],[974,713],[881,339],[727,189],[602,226],[783,458],[504,81],[975,347],[758,369],[824,21],[884,269],[278,223],[884,754],[928,870],[974,635],[957,415],[626,161],[925,246],[963,858],[400,184],[837,247],[369,59],[748,13],[870,315],[524,164],[622,511],[914,373],[746,18],[407,103],[551,13],[784,450],[157,60],[471,360],[132,75],[883,155],[277,271],[826,524],[769,263],[912,665],[741,241],[508,151],[872,474],[627,504],[656,389],[817,501],[791,256],[840,737],[709,571],[922,85],[791,568],[494,106],[912,59],[983,938],[212,159],[704,517],[509,415],[524,94],[375,138],[505,336],[974,549],[298,200],[671,448],[747,294],[748,367],[642,300],[520,110],[702,296],[510,509],[320,244],[777,214],[348,233],[888,711],[634,140],[929,361],[406,375],[664,7],[962,204],[981,562],[964,521],[456,322],[512,194],[490,55],[718,406],[649,448],[986,64],[399,293],[857,693],[517,94],[745,627],[811,558],[870,5],[623,251],[463,370],[392,74],[286,137],[777,433],[701,317],[505,179],[954,542],[717,600],[884,691],[648,289],[490,475],[983,680],[995,166],[665,46],[247,106],[971,84],[277,175],[674,123],[811,51],[829,688],[903,744],[538,405],[610,317],[941,240],[935,232],[238,91],[551,355],[820,86],[508,166],[755,653],[432,295],[846,252],[939,847],[648,421],[675,118],[234,53],[933,585],[930,459],[981,283],[149,143],[874,852],[195,104],[724,517],[249,47],[509,75],[718,408],[848,425],[958,13],[337,121],[993,339],[609,202],[619,514],[916,892],[638,382],[888,396],[866,302],[364,241],[920,318],[825,326],[658,206],[756,476],[428,302],[858,235],[759,624],[722,156],[658,392],[912,509],[960,621],[790,540],[983,800],[586,121],[676,609],[647,592],[953,491],[558,189],[990,377],[700,15],[993,693],[722,130],[715,177],[729,617],[857,111],[863,558],[683,301],[128,91],[920,56],[807,209],[811,236],[842,159],[952,926],[359,274],[935,194],[601,421],[973,899],[531,351],[163,51],[789,739],[982,510],[670,645],[362,167],[290,66],[132,127],[674,670],[645,511],[213,89],[837,765],[884,146],[149,40],[731,722],[681,471],[858,77],[607,48],[626,295],[733,575],[657,181],[746,523],[467,110],[664,347],[957,356],[703,179],[766,367],[893,160],[667,135],[923,198],[923,432],[473,36],[442,156],[612,139],[964,230],[764,534],[990,148],[613,500],[445,322],[929,595],[990,711],[592,52],[844,6],[601,581],[859,622],[851,16],[436,181],[586,81],[703,464],[257,209],[976,758],[917,293],[976,729],[641,588],[450,141],[283,86],[959,507],[746,600],[644,331],[251,47],[506,469],[597,102],[132,41],[106,21],[219,169],[982,256],[978,218],[732,468],[10,1],[286,35],[227,211],[902,300],[871,652],[810,791],[364,109],[886,749],[416,407],[564,356],[880,711],[957,461],[549,326],[419,298],[922,65],[830,719],[828,376],[927,713],[837,593],[499,236],[650,478],[848,732],[966,912],[573,394],[973,336],[901,104],[636,429],[563,428],[452,172],[881,288],[779,56],[684,191],[859,418],[459,14],[693,293],[942,118],[282,240],[108,72],[405,239],[108,45],[560,391],[827,745],[892,148],[750,212],[524,305],[792,476],[377,15],[941,433],[421,105],[257,253],[871,633],[614,148],[718,303],[931,661],[750,508],[592,494],[915,592],[843,78],[992,971],[904,521],[826,102],[848,765],[701,312],[978,519],[699,367],[859,249],[578,250],[254,94],[758,122],[385,44],[612,449],[192,130],[981,387],[725,524],[856,728],[850,29],[329,44],[283,217],[399,185],[660,9],[766,269],[926,205],[764,295],[753,285],[759,161],[976,597],[679,296],[93,51],[334,154],[825,665],[780,421],[904,238],[672,202],[323,217],[295,286],[473,350],[795,336],[922,22],[670,103],[678,41],[768,532],[768,626],[765,616],[595,472],[936,78],[487,178],[249,21],[848,647],[572,464],[540,363],[749,76],[443,205],[870,127],[507,52],[224,223],[634,496],[798,681],[997,690],[859,542],[779,331],[927,458],[879,525],[795,568],[660,190],[727,524],[744,440],[298,107],[931,292],[737,45],[812,751],[838,826],[579,365],[681,475],[585,459],[512,219],[994,464],[976,383],[672,258],[419,355],[923,19],[764,565],[481,444],[985,245],[705,328],[110,103],[950,234],[401,126],[694,163],[623,480],[366,257],[187,31],[699,136],[629,35],[802,223],[621,498],[929,612],[595,439],[252,55],[952,9],[899,159],[898,106],[632,104],[201,149],[885,752],[367,356],[465,320],[811,552],[753,655],[500,418],[603,81],[773,704],[944,905],[822,307],[929,42],[904,825],[910,792],[909,512],[818,621],[916,575],[403,99],[959,206],[918,571],[613,301],[581,131],[644,58],[411,241],[408,91],[640,459],[530,519],[932,793],[460,137],[352,77],[820,12],[591,9],[719,476],[835,46],[317,53],[187,36],[697,193],[953,658],[894,870],[768,616],[256,191],[908,283],[875,480],[552,277],[767,230],[901,76],[103,19],[478,392],[846,294],[740,294],[605,597],[993,878],[834,643],[608,326],[308,48],[729,377],[772,375],[589,488],[531,243],[689,479],[574,281],[833,133],[364,153],[905,184],[131,120],[780,409],[986,969],[845,588],[234,134],[935,563],[958,923],[524,513],[611,167],[905,95],[524,211],[659,382],[828,733],[601,185],[352,243],[622,222],[728,521],[594,162],[997,854],[555,188],[950,438],[866,453],[201,161],[942,837],[794,370],[398,349],[644,481],[873,607],[531,255],[980,425],[357,94],[257,232],[885,657],[233,205],[558,425],[840,741],[816,664],[873,133],[946,259],[666,522],[942,604],[387,316],[892,644],[342,196],[221,207],[796,653],[95,26],[284,201],[967,893],[659,294],[526,305],[660,610],[900,720],[943,855],[948,357],[721,398],[641,316],[962,522],[451,261],[589,225],[875,286],[264,214],[857,297],[554,149],[365,8],[518,444],[571,76],[738,364],[137,110],[918,154],[965,393],[921,802],[869,254],[804,669],[777,283],[885,629],[877,19],[941,250],[952,45],[744,384],[605,152],[749,111],[243,57],[996,8],[975,167],[740,214],[947,444],[369,314],[834,79],[875,313],[461,343],[929,395],[547,180],[380,292],[854,366],[425,95],[448,101],[922,44],[992,506],[872,776],[963,523],[956,585],[342,54],[904,685],[575,212],[649,600],[687,65],[494,157],[905,15],[341,218],[696,495],[986,860],[497,427],[918,790],[960,566],[516,242],[153,82],[706,498],[944,364],[742,681],[258,0],[472,20],[981,183],[828,277],[401,53],[645,405],[998,577],[882,99],[474,472],[518,481],[194,0],[189,171],[930,768],[814,779],[698,591],[573,85],[745,729],[482,29],[269,196],[607,431],[414,227],[496,108],[190,1],[942,881],[858,746],[934,35],[382,107],[770,541],[856,812],[579,20],[835,15],[908,419],[605,155],[828,425],[548,371],[427,80],[774,319],[998,913],[280,0],[695,114],[750,400],[183,160],[571,272],[980,919],[428,25],[981,553],[455,181],[471,353],[424,334],[129,86],[631,280],[995,387],[555,322],[887,92],[863,684],[624,393],[764,466],[173,90],[504,142],[800,46],[534,133],[978,166],[401,393],[940,844],[964,643],[801,783],[926,856],[641,604],[237,123],[382,377],[576,561],[805,705],[478,472],[930,355],[531,359],[294,238],[756,710],[435,220],[876,717],[353,174],[720,199],[850,843],[780,615],[535,392],[786,200],[776,133],[597,241],[877,211],[580,487],[420,20],[905,170],[282,17],[906,799],[801,776],[612,10],[657,387],[256,153],[817,221],[624,333],[395,75],[846,12],[146,18],[909,359],[761,751],[788,534],[863,802],[985,795],[705,497],[465,211],[561,16],[908,458],[831,500],[815,121],[931,652],[400,176],[428,57],[970,536],[778,242],[639,595],[922,703],[77,68],[791,787],[466,134],[679,410],[747,243],[195,86],[829,579],[809,607],[616,584],[177,142],[743,726],[904,23],[817,431],[931,577],[421,116],[992,563],[712,83],[564,384],[590,183],[988,450],[912,100],[750,138],[749,349],[580,138],[627,77],[513,91],[295,88],[528,12],[983,173],[106,105],[591,239],[528,222],[727,17],[963,17],[485,150],[226,201],[932,239],[614,0],[689,425],[715,266],[907,682],[980,330],[801,771],[713,679],[975,265],[799,751],[668,486],[967,156],[397,163],[763,636],[532,383],[953,515],[776,61],[741,610],[771,497],[915,342],[630,62],[314,260],[728,446],[850,170],[576,23],[196,48],[258,234],[958,228],[799,52],[423,129],[892,216],[944,780],[841,643],[619,603],[878,607],[510,488],[167,58],[938,412],[717,422],[958,751],[696,361],[771,144],[857,402],[977,905],[686,474],[931,629],[818,235],[892,749],[962,787],[947,563],[789,771],[748,301],[426,367],[753,170],[575,337],[240,196],[875,549],[38,3],[863,390],[759,267],[854,611],[150,85],[632,303],[640,595],[334,232],[411,327],[423,35],[972,779],[461,321],[868,321],[790,633],[364,338],[652,7],[310,124],[799,540],[375,124],[859,590],[882,662],[204,169],[426,150],[610,364],[933,817],[635,91],[605,470],[866,613],[916,686],[557,369],[660,388],[618,517],[948,645],[883,194],[250,137],[923,568],[543,475],[900,358],[574,175],[527,188],[520,367],[366,79],[740,551],[737,99],[858,610],[650,233],[771,659],[453,268],[696,71],[859,742],[585,63],[936,662],[790,587],[661,599],[813,611],[741,627],[131,72],[891,452],[896,823],[413,301],[450,442],[310,273],[636,373],[846,82],[351,286],[879,229],[990,217],[984,410],[529,477],[201,131],[947,897],[830,392],[995,464],[533,434],[898,247],[759,585],[527,134],[324,179],[516,217],[625,46],[501,60],[724,209],[612,427],[586,241],[457,162],[453,87],[922,452],[951,797],[655,288],[906,608],[959,523],[608,81],[524,169],[513,99],[953,820],[831,711],[952,346],[731,50],[387,93],[666,469],[375,37],[336,291],[823,569],[602,374],[311,24],[583,492],[867,239],[387,64],[270,112],[947,692],[859,520],[846,416],[896,72],[155,22],[631,35],[216,41],[948,175],[600,547],[897,174],[811,381],[942,25],[513,285],[908,821],[906,71],[859,141],[740,660],[180,69],[246,38],[681,179],[518,363],[724,226],[326,220],[934,739],[478,388],[617,31],[986,881],[388,77],[900,392],[372,254],[824,519],[488,128],[472,247],[856,798],[71,55],[703,461],[780,488],[451,300],[461,391],[477,210],[746,209],[785,780],[874,614],[341,158],[292,162],[750,487],[912,374],[736,509],[687,131],[615,68],[919,729],[458,70],[880,259],[569,202],[589,487],[803,465],[829,374],[662,651],[390,132],[903,887],[671,41],[929,407],[787,86],[345,207],[628,330],[429,383],[912,187],[890,498],[791,533],[959,438],[947,633],[716,641],[661,643],[863,793],[316,284],[989,56],[911,893],[969,572],[786,675],[930,531],[320,297],[964,798],[436,10],[394,177],[450,388],[419,95],[745,482],[964,204],[796,430],[475,282],[655,412],[729,555],[390,15],[949,389],[925,289],[914,337],[588,22],[579,468],[600,334],[839,349],[232,218],[540,208],[244,74],[988,573],[767,101],[716,628],[447,165],[902,175],[969,303],[672,577],[828,665],[588,304],[814,164],[906,446],[484,66],[243,139],[563,305],[181,135],[912,401],[384,190],[450,225],[994,649],[504,234],[979,801],[825,647],[650,89],[724,307],[552,71],[813,407],[560,436],[793,634],[987,751],[617,473],[146,46],[681,461],[777,694],[444,319],[866,660],[246,190],[787,264],[959,907],[936,756],[513,301],[991,144],[370,141],[932,387],[881,792],[929,35],[535,199],[945,742],[431,191],[831,757],[859,388],[999,466],[927,261],[987,504],[693,66],[662,100],[916,217],[633,159],[935,340],[872,861],[635,619],[86,30],[926,487],[608,599],[952,367],[703,519],[851,353],[946,240],[253,176],[686,533],[488,207],[900,892],[626,275],[876,711],[611,293],[463,445],[320,274],[739,49],[625,492],[832,66],[934,862],[965,387],[271,9],[869,791],[586,142],[846,254],[900,759],[665,343],[976,365],[756,438],[961,331],[790,148],[406,62],[918,148],[703,241],[956,395],[552,165],[420,21],[364,77],[597,63],[267,136],[442,133],[603,436],[303,291],[403,79],[976,903],[103,44],[449,252],[989,559],[384,114],[743,709],[914,124],[523,489],[878,809],[576,253],[322,10],[555,29],[569,296],[820,146],[910,753],[994,77],[559,349],[731,7],[539,241],[999,395],[698,202],[785,465],[325,117],[523,366],[248,174],[666,14],[847,823],[754,574],[952,756],[831,179],[368,83],[804,341],[585,364],[952,467],[810,712],[684,316],[869,587],[975,552],[912,312],[660,201],[717,667],[227,11],[742,222],[663,250],[502,489],[518,99],[245,28],[457,160],[899,668],[983,330],[728,519],[973,273],[708,173],[704,553],[692,581],[998,454],[469,177],[601,51],[971,14],[942,43],[743,361],[889,686],[549,44],[676,521],[893,463],[488,210],[579,256],[605,411],[927,132],[804,385],[785,243],[893,575],[994,539],[131,110],[858,718],[401,379],[800,209],[715,495],[249,71],[259,39],[482,310],[806,133],[933,580],[119,5],[639,5],[328,215],[347,188],[928,684],[871,17],[612,43],[954,660],[975,159],[444,417],[253,173],[534,418],[486,44],[349,297],[196,115],[572,456],[752,558],[225,98],[602,157],[371,64],[697,135],[768,520],[581,530],[818,370],[835,738],[673,304],[697,455],[612,242],[587,3],[882,414],[774,587],[476,49],[266,188],[842,88],[417,31],[379,74],[973,197],[630,324],[872,279],[203,94],[215,127],[691,23],[813,26],[504,469],[808,253],[737,676],[467,285],[999,205],[692,268],[465,237],[457,429],[245,115],[471,211],[660,626],[789,124],[654,489],[773,173],[777,309],[800,559],[729,326],[749,713],[659,332],[698,281],[288,89],[958,489],[891,372],[990,363],[503,238],[895,832],[263,127],[515,224],[880,789],[635,195],[869,712],[892,28],[317,292],[411,207],[434,388],[33,25],[549,195],[984,768],[813,2],[759,460],[377,20],[949,704],[969,38],[815,665],[870,694],[830,164],[603,244],[326,89],[663,166],[315,10],[893,818],[774,251],[475,248],[284,109],[949,285],[734,222],[674,16],[933,538],[411,136],[739,417],[436,348],[900,6],[814,320],[326,28],[847,198],[189,99],[647,466],[829,427],[418,398],[731,523],[470,175],[571,65],[762,146],[888,661],[746,79],[237,95],[415,367],[840,312],[794,568],[538,112],[615,187],[999,852],[584,5],[963,657],[654,407],[409,285],[560,531],[185,103],[952,432],[756,642],[600,594],[739,641],[868,752],[717,353],[494,227],[969,80],[926,2],[965,526],[544,524],[739,492],[573,200],[957,909],[691,618],[990,918],[671,94],[954,89],[243,78],[839,414],[934,776],[133,30],[642,395],[704,406],[404,370],[354,224],[986,924],[885,363],[882,103],[649,212],[363,188],[311,96],[384,225],[814,502],[97,96],[666,172],[867,212],[381,57],[935,324],[709,149],[927,115],[931,752],[977,273],[434,31],[789,210],[863,695],[713,265],[472,219],[827,53],[820,65],[620,8],[827,217],[820,247],[854,245],[990,528],[679,459],[869,307],[900,669],[942,657],[810,245],[584,419],[747,507],[668,131],[552,55],[894,424],[598,509],[937,119],[682,592],[845,590],[262,175],[396,267],[473,47],[307,45],[478,371],[938,125],[824,333],[747,382],[524,401],[347,274],[745,339],[941,423],[922,123],[397,106],[386,212],[875,232],[916,192],[343,143],[964,135],[520,76],[998,527],[297,219],[759,667],[284,131],[530,157],[754,130],[778,625],[968,582],[419,177],[698,426],[679,631],[579,99],[899,446],[872,123],[431,190],[739,346],[850,525],[487,357],[540,52],[428,193],[411,138],[686,202],[128,96],[630,577],[325,3],[730,10],[678,672],[719,559],[597,443],[899,588],[686,471],[417,311],[558,415],[982,550],[417,324],[583,578],[809,136],[599,5],[753,572],[924,571],[569,526],[294,187],[116,50],[990,145],[638,444],[830,691],[237,34],[686,635],[250,115],[515,172],[660,655],[846,437],[867,366],[537,512],[665,263],[460,189],[477,103],[985,289],[993,960],[933,16],[939,785],[61,34],[656,178],[898,700],[935,532],[360,113],[275,130],[855,569],[747,87],[958,79],[879,853],[643,206],[763,539],[736,421],[896,453],[543,48],[362,208],[791,354],[585,95],[948,234],[222,134],[877,44],[957,789],[290,116],[967,636],[844,484],[981,549],[723,700],[777,157],[978,602],[997,711],[389,308],[842,723],[614,339],[392,207],[404,64],[799,143],[260,55],[823,606],[702,469],[908,24],[732,564],[521,479],[332,322],[704,539],[533,49],[317,162],[370,29],[215,22],[484,384],[679,32],[681,91],[959,829],[767,369],[939,435],[314,201],[720,581],[724,265],[190,97],[645,92],[635,24],[232,41],[965,276],[661,338],[847,47],[916,571],[453,131],[951,174],[584,258],[531,160],[988,233],[641,96],[804,477],[548,383],[99,44],[951,344],[939,759],[338,89],[620,411],[709,695],[951,749],[660,383],[914,492],[828,624],[870,77],[983,474],[881,679],[997,458],[803,448],[920,267],[561,431],[975,557],[786,470],[792,237],[670,7],[314,88],[454,41],[655,69],[481,111],[927,68],[729,101],[247,35],[494,43],[904,383],[994,662],[356,43],[809,628],[728,217],[904,727],[900,633],[679,31],[972,321],[998,373],[315,306],[856,87],[630,73],[765,57],[877,833],[708,88],[753,529],[847,678],[300,127],[925,496],[600,313],[531,244],[166,114],[372,125],[921,318],[927,203],[658,27],[917,798],[943,426],[766,181],[634,495],[831,605],[817,190],[387,208],[274,106],[779,556],[584,153],[855,86],[500,97],[364,47],[317,272],[352,113],[891,537],[732,422],[501,135],[614,568],[829,554],[698,314],[710,585],[268,25],[508,357],[194,163],[672,247],[718,576],[940,99],[379,185],[816,310],[690,127],[596,541],[965,743],[868,441],[260,30],[969,917],[967,732],[394,64],[983,432],[432,145],[716,96],[325,249],[514,197],[498,312],[864,462],[898,668],[908,776],[607,256],[882,813],[818,346],[848,44],[863,155],[690,111],[708,380],[838,686],[298,293],[294,101],[897,60],[757,534],[621,24],[915,252],[783,374],[948,100],[939,703],[817,112],[497,320],[991,110],[737,513],[693,360],[638,326],[695,329],[723,688],[607,142],[849,725],[660,222],[352,136],[969,763],[602,465],[536,113],[877,138],[976,921],[896,82],[890,363],[901,419],[542,69],[875,214],[984,522],[796,251],[341,166],[916,60],[668,471],[664,422],[919,594],[532,523],[167,17],[412,136],[491,194],[168,13],[806,798],[799,162],[285,148],[887,612],[766,61],[859,312],[490,73],[742,538],[654,176],[419,53],[200,24],[889,711],[955,201],[713,442],[721,114],[328,261],[723,579],[543,271],[95,33],[836,303],[576,16],[514,145],[901,503],[688,333],[996,16],[722,454],[904,849],[971,915],[964,757],[321,305],[760,575],[797,239],[961,828],[664,503],[840,98],[976,577],[862,59],[811,394],[952,147],[777,415],[452,255],[709,629],[683,502],[911,566],[537,212],[627,514],[808,414],[898,98],[542,140],[275,147],[338,225],[786,364],[798,758],[774,325],[922,164],[520,0],[801,341],[232,53],[834,707],[715,417],[863,319],[827,285],[913,47],[654,351],[569,167],[730,369],[589,269],[396,324],[625,72],[594,264],[826,425],[648,137],[883,426],[477,164],[117,30],[882,736],[551,376],[921,832],[388,322],[898,427],[820,465],[609,212],[789,320],[696,370],[674,283],[841,732],[391,181],[972,89],[670,456],[372,128],[586,129],[533,346],[774,43],[879,137],[819,605],[741,574],[787,234],[333,286],[768,523],[750,572],[904,818],[749,102],[757,617],[738,578],[829,426],[680,165],[546,150],[885,487],[462,283],[491,465],[489,344],[384,32],[814,135],[631,386],[568,296],[961,933],[886,672],[987,464],[283,177],[766,370],[523,47],[456,16],[962,526],[550,110],[823,339],[651,185],[767,419],[830,821],[379,211],[794,257],[491,127],[860,90],[830,428],[530,211],[594,467],[592,567],[568,487],[491,440],[891,716],[591,455],[175,96],[945,527],[896,751],[894,386],[459,240],[946,508],[924,719],[498,405],[563,224],[546,438],[907,904],[980,349],[995,705],[673,585],[806,579],[709,274],[492,417],[887,62],[450,115],[727,699],[561,257],[907,265],[834,603],[430,397],[959,2],[986,904],[660,246],[869,210],[822,130],[601,595],[234,99],[713,267],[622,318],[929,413],[993,886],[641,104],[916,518],[417,242],[352,95],[473,422],[587,416],[969,850],[918,649],[712,531],[994,331],[742,706],[417,269],[844,533],[173,95],[503,133],[875,78],[544,466],[898,855],[937,524],[884,242],[841,279],[269,85],[380,142],[567,238],[481,95],[701,544],[361,207],[654,138],[924,96],[977,106],[416,160],[814,309],[593,221],[881,732],[386,13],[859,16],[747,601],[778,567],[880,781],[225,128],[854,604],[632,393],[298,3],[675,73],[216,208],[859,217],[777,663],[803,776],[620,261],[905,225],[425,259],[807,202],[350,283],[456,337],[752,690],[523,445],[548,434],[468,382],[613,12],[636,596],[289,256],[838,318],[453,421],[873,683],[950,535],[858,303],[245,34],[909,891],[642,18],[809,556],[294,23],[907,324],[292,193],[524,268],[638,194],[281,202],[866,828],[636,335],[859,204],[221,194],[538,415],[820,67],[490,229],[525,519],[991,245],[904,570],[826,144],[803,316],[293,42],[390,237],[301,168],[158,150],[654,250],[983,418],[785,581],[525,249],[955,723],[475,334],[839,73],[879,335],[775,398],[729,89],[917,507],[563,166],[716,201],[878,497],[689,595],[323,285],[840,756],[201,139],[947,614],[488,252],[828,272],[799,108],[610,548],[808,248],[768,243],[913,141],[496,175],[814,592],[607,595],[936,388],[664,655],[924,327],[617,138],[732,282],[962,134],[718,226],[829,617],[523,448],[448,384],[333,139],[794,612],[953,867],[867,90],[923,139],[926,639],[963,529],[717,179],[616,150],[928,190],[972,881],[463,411],[789,431],[957,685],[721,464],[799,16],[741,46],[800,5],[745,585],[460,329],[924,141],[553,267],[964,826],[838,426],[931,890],[849,148],[627,348],[343,3],[972,364],[976,172],[406,64],[600,531],[382,10],[465,97],[930,177],[913,8],[497,121],[553,309],[985,312],[902,321],[442,84],[540,201],[531,30],[943,517],[482,75],[330,320],[871,50],[807,163],[857,224],[507,148],[283,185],[666,284],[678,81],[667,157],[923,456],[965,663],[368,176],[316,203],[859,556],[958,932],[534,64],[841,736],[946,376],[503,91],[901,89],[807,402],[876,579],[868,55],[460,12],[781,463],[641,242],[884,462],[513,248],[509,27],[609,49],[976,763],[996,946],[795,570],[758,661],[680,19],[818,129],[837,518],[676,159],[923,850],[454,228],[482,435],[342,2],[290,127],[531,5],[656,396],[866,38],[623,198],[862,309],[521,193],[271,87],[652,346],[955,466],[915,869],[956,55],[696,431],[815,601],[772,243],[831,688],[962,553],[985,609],[810,392],[261,59],[730,26],[635,199],[710,102],[983,277],[885,241],[995,631],[976,269],[440,28],[545,34],[463,102],[840,366],[457,234],[562,127],[283,32],[778,461],[730,442],[826,199],[877,186],[944,222],[554,524],[841,76],[427,170],[733,45],[602,496],[562,81],[515,71],[452,68],[362,284],[938,714],[350,213],[629,285],[745,244],[916,42],[911,810],[489,189],[486,286],[882,251],[556,437],[519,151],[530,293],[867,251],[963,546],[118,75],[916,655],[530,283],[447,99],[947,478],[869,143],[463,233],[607,13],[435,399],[418,91],[971,99],[410,404],[734,72],[969,647],[767,9],[902,673],[977,816],[725,308],[908,131],[750,452],[510,446],[606,399],[880,761],[892,212],[422,33],[313,217],[666,229],[769,230],[361,194],[724,298],[832,407],[603,62],[166,39],[522,176],[369,155],[826,406],[751,661],[211,115],[886,718],[571,283],[174,30],[971,736],[514,65],[734,70],[953,574],[824,72],[496,492],[776,48],[730,76],[785,99],[680,618],[743,290],[997,770],[196,137],[388,372],[873,268],[599,347],[927,564],[152,89],[648,615],[947,4],[949,793],[615,287],[720,302],[991,805],[695,386],[757,8],[759,392],[930,749],[161,141],[468,39],[283,249],[860,842],[827,6],[989,857],[826,38],[649,289],[723,129],[506,306],[160,128],[538,536],[745,464],[876,142],[851,775],[735,425],[131,32],[672,239],[471,465],[847,92],[978,796],[401,208],[729,595],[664,480],[801,263],[808,801],[917,50],[793,489],[787,549],[753,620],[166,75],[792,553],[422,97],[124,9],[865,162],[663,48],[914,348],[969,109],[601,523],[727,103],[587,417],[948,491],[709,383],[725,210],[611,1],[929,691],[671,39],[991,50],[884,14],[962,44],[461,39],[866,739],[244,0],[713,522],[648,452],[729,691],[666,450],[835,183],[685,537],[559,443],[913,188],[933,98],[565,97],[652,371],[311,201],[474,87],[748,354],[484,0],[841,257],[645,491],[663,157],[990,588],[647,20],[618,49],[755,14],[398,77],[475,394],[486,187],[794,573],[851,400],[765,668],[675,555],[867,96],[639,508],[271,118],[865,649],[667,65],[351,273],[504,219],[875,605],[864,312],[519,369],[819,454],[998,157],[550,425],[519,145],[463,12],[921,903],[627,417],[693,401],[959,146],[552,452],[969,513],[886,69],[697,48],[818,520],[572,544],[832,563],[618,119],[71,39],[947,713],[316,59],[430,148],[555,31],[994,138],[740,639],[531,388],[911,489],[729,648],[718,321],[602,159],[852,448],[343,74],[337,17],[338,186],[981,791],[878,432],[469,455],[829,824],[717,447],[586,13],[793,38],[791,191],[357,330],[817,321],[799,373],[981,274],[736,16],[806,521],[716,461],[603,385],[987,382],[514,437],[639,486],[997,888],[961,501],[442,269],[313,175],[735,550],[565,216],[909,420],[394,259],[105,30],[869,814],[376,314],[91,27],[474,455],[621,79],[751,204],[829,572],[640,319],[852,354],[385,191],[911,705],[901,83],[988,713],[519,452],[689,35],[865,516],[984,879],[992,447],[388,14],[949,672],[979,33],[629,19],[859,476],[950,364],[766,224],[805,381],[796,406],[618,80],[772,710],[756,399],[504,10],[792,13],[798,259],[116,20],[407,27],[468,156],[767,208],[888,397],[505,232],[715,402],[497,393],[731,466],[732,506],[320,232],[810,571],[435,74],[727,504],[740,57],[706,6],[660,127],[835,200],[750,477],[632,477],[296,271],[654,8],[939,100],[839,774],[521,149],[202,86],[731,564],[203,84],[805,591],[476,153],[887,105],[504,245],[538,56],[766,24],[145,85],[547,514],[687,611],[926,191],[981,958],[972,55],[894,473],[794,493],[881,234],[715,351],[553,534],[919,785],[926,520],[972,172],[503,3],[439,274],[716,453],[997,669],[682,266],[518,373],[484,287],[586,550],[990,524],[464,405],[826,30],[467,380],[658,116],[959,601],[786,486],[998,652],[733,222],[911,453],[874,553],[272,100],[425,90],[864,411],[507,251],[735,509],[647,159],[158,119],[469,310],[863,731],[733,535],[793,282],[855,632],[637,620],[725,628],[490,167],[914,527],[884,883],[736,85],[111,20],[747,648],[486,178],[919,363],[967,624],[873,617],[930,72],[740,90],[453,212],[612,313],[425,269],[689,414],[953,67],[198,152],[963,211],[147,110],[581,534],[510,318],[883,1],[720,546],[806,266],[193,165],[674,315],[334,288],[816,608],[666,644],[730,93],[569,131],[626,58],[303,54],[201,167],[852,258],[789,53],[628,16],[607,602],[773,192],[564,245],[747,697],[878,617],[983,482],[713,263],[992,134],[629,419],[297,111],[409,88],[414,96],[332,18],[916,818],[745,608],[623,5],[718,65],[321,16],[588,538],[815,707],[772,95],[144,137],[617,3],[311,287],[813,359],[226,103],[718,481],[322,294],[900,388],[545,78],[829,418],[476,274],[844,159],[430,388],[494,480],[834,239],[560,176],[313,153],[811,534],[852,498],[780,552],[195,46],[385,90],[396,73],[436,17],[843,139],[927,281],[853,246],[770,380],[249,37],[914,116],[838,344],[966,894],[580,170],[966,429],[470,35],[208,191],[905,754],[269,5],[861,365],[937,188],[880,574],[700,185],[741,67],[640,7],[351,60],[753,397],[819,93],[982,446],[956,370],[875,77],[732,48],[963,667],[843,484],[820,424],[510,136],[820,648],[722,151],[212,150],[806,39],[916,417],[630,488],[629,111],[821,562],[802,134],[893,276],[891,413],[679,229],[899,517],[886,334],[503,428],[907,330],[740,174],[932,232],[742,63],[427,217],[356,178],[863,121],[391,285],[827,730],[489,215],[561,88],[564,422],[884,267],[796,30],[801,469],[405,294],[578,515],[686,336],[959,234],[605,275],[493,24],[944,656],[861,222],[772,454],[995,752],[542,464],[353,207],[933,928],[825,804],[910,847],[937,414],[769,739],[901,668],[669,513],[985,955],[380,12],[738,575],[498,120],[445,44],[562,238],[974,533],[825,770],[711,34],[546,138],[723,568],[567,196],[567,466],[584,350],[978,522],[719,142],[737,508],[648,124],[897,803],[878,590],[569,30],[661,11],[486,191],[569,488],[744,700],[873,165],[87,15],[462,190],[963,810],[985,305],[397,120],[526,65],[896,54],[544,488],[637,141],[428,299],[335,251],[531,153],[984,885],[693,593],[890,547],[387,307],[410,114],[869,855],[651,78],[979,477],[931,263],[872,363],[698,301],[516,370],[577,529],[893,691],[818,498],[880,427],[765,105],[475,118],[688,502],[403,63],[728,585],[803,32],[716,634],[558,346],[931,465],[778,647],[649,435],[932,824],[414,371],[893,238],[734,705],[252,69],[621,156],[823,764],[867,60],[499,261],[981,764],[885,176],[389,143],[538,514],[846,103],[558,54],[886,644],[877,703],[258,162],[926,604],[242,118],[779,477],[572,70],[538,53],[855,298],[608,331],[279,100],[754,222],[939,99],[813,33],[995,378],[230,60],[930,330],[430,81],[754,293],[673,494],[609,513],[409,264],[895,40],[773,557],[822,358],[778,403],[352,198],[723,178],[842,510],[548,148],[487,87],[500,70],[961,863],[802,608],[363,265],[467,303],[621,454],[554,183],[601,101],[574,489],[958,813],[236,224],[899,884],[998,532],[920,679],[916,62],[415,326],[674,463],[750,583],[817,51],[763,643],[159,86],[928,825],[988,579],[855,851],[628,217],[790,616],[638,278],[585,55],[610,429],[665,453],[846,799],[616,394],[943,824],[649,60],[780,484],[534,314],[763,574],[393,123],[338,42],[953,534],[459,291],[969,33],[996,940],[645,564],[584,443],[383,207],[100,17],[997,367],[373,94],[704,61],[822,175],[283,44],[884,43],[684,341],[920,811],[234,22],[727,595],[707,503],[461,416],[500,322],[961,553],[471,218],[812,291],[964,524],[392,2],[631,424],[318,69],[793,534],[579,275],[495,494],[903,355],[372,219],[110,81],[591,31],[798,83],[192,21],[827,30],[996,748],[461,414],[216,201],[297,42],[366,67],[535,97],[497,70],[634,387],[810,170],[747,462],[722,203],[627,217],[297,13],[986,957],[374,5],[680,438],[873,216],[671,226],[453,313],[22,13],[363,257],[457,74],[997,775],[586,175],[974,795],[625,322],[531,400],[570,98],[597,36],[741,206],[243,185],[624,141],[236,31],[982,227],[143,66],[662,361],[803,346],[484,266],[897,549],[406,357],[884,88],[657,147],[507,62],[663,94],[901,84],[69,30],[274,10],[860,369],[750,404],[392,91],[823,111],[872,442],[594,286],[910,593],[882,498],[353,27],[381,172],[699,120],[850,49],[747,616],[982,185],[778,342],[627,352],[389,151],[742,713],[843,409],[833,667],[795,714],[855,650],[954,426],[755,306],[284,100],[960,231],[246,217],[561,75],[586,145],[767,373],[692,359],[755,360],[610,486],[842,38],[717,248],[383,206],[792,224],[469,339],[808,259],[109,17],[396,218],[947,842],[587,459],[206,19],[568,559],[874,786],[632,147],[855,219],[385,127],[375,277],[475,291],[458,124],[618,36],[32,15],[522,409],[591,60],[110,65],[733,189],[809,310],[324,18],[613,530],[940,454],[709,395],[339,219],[378,149],[886,719],[722,230],[977,1],[645,598],[67,11],[467,251],[536,247],[987,520],[991,267],[510,250],[776,29],[906,129],[581,360],[841,807],[947,66],[828,24],[361,72],[741,315],[964,891],[484,30],[639,158],[677,468],[425,339],[588,114],[834,437],[984,31],[345,91],[833,718],[321,165],[940,496],[884,648],[976,90],[818,73],[489,317],[714,314],[311,35],[870,393],[652,201],[886,721],[609,543],[992,295],[965,51],[769,100],[560,207],[597,536],[525,511],[484,259],[989,866],[439,282],[253,84],[854,443],[953,303],[675,398],[762,246],[458,143],[471,64],[859,692],[642,289],[750,60],[789,340],[454,218],[275,51],[989,34],[664,290],[973,702],[674,583],[374,274],[843,767],[984,466],[651,278],[563,89],[731,557],[814,754],[854,309],[870,683],[767,411],[302,203],[926,572],[848,767],[819,148],[305,231],[295,217],[849,124],[779,318],[854,736],[996,95],[737,616],[592,371],[845,539],[961,869],[498,55],[500,474],[745,264],[534,141],[633,435],[892,421],[368,64],[831,217],[681,116],[405,322],[299,167],[710,319],[975,351],[601,302],[688,586],[346,214],[897,324],[963,726],[591,200],[805,411],[685,458],[908,108],[720,591],[905,459],[279,167],[689,206],[902,63],[898,621],[693,540],[964,162],[858,720],[220,151],[851,394],[186,163],[966,781],[959,804],[247,228],[806,727],[938,914],[736,461],[632,113],[522,500],[918,694],[377,226],[261,58],[912,332],[660,657],[901,327],[619,553],[822,543],[336,308],[329,86],[197,165],[246,72],[502,349],[595,29],[485,306],[974,157],[106,32],[321,29],[931,378],[345,98],[227,214],[622,130],[964,219],[928,178],[825,753],[708,471],[994,580],[886,746],[306,0],[999,202],[835,649],[725,54],[536,278],[680,601],[749,44],[504,344],[450,339],[758,193],[335,83],[613,567],[952,543],[692,76],[517,324],[154,62],[911,612],[812,762],[452,59],[815,438],[998,738],[945,420],[555,170],[831,777],[355,134],[945,308],[843,37],[806,616],[535,353],[576,303],[580,469],[858,270],[984,882],[725,184],[842,724],[702,442],[185,11],[505,392],[350,67],[786,513],[975,260],[578,252],[569,26],[566,466],[969,585],[777,162],[856,653],[345,215],[450,22],[537,288],[731,389],[835,530],[759,646],[903,226],[558,32],[960,724],[949,148],[976,783],[854,840],[998,444],[456,378],[832,446],[355,309],[661,102],[268,18],[530,215],[871,53],[561,497],[898,696],[851,743],[660,523],[961,513],[928,645],[617,500],[941,638],[585,300],[441,77],[744,186],[254,13],[782,138],[425,195],[935,130],[926,852],[425,371],[538,256],[771,218],[802,217],[614,566],[847,284],[594,33],[710,548],[867,187],[669,534],[924,239],[886,431],[798,573],[924,350],[686,310],[283,90],[734,715],[815,312],[858,127],[723,548],[980,254],[310,285],[908,400],[574,11],[953,707],[90,65],[585,281],[696,205],[967,60],[297,183],[282,231],[493,322],[801,265],[411,379],[771,523],[392,145],[321,35],[194,116],[982,652],[861,1],[962,579],[411,252],[785,460],[657,134],[334,123],[271,116],[857,674],[855,585],[448,348],[729,334],[747,379],[711,541],[118,57],[953,682],[598,592],[765,731],[815,0],[722,275],[668,583],[871,423],[827,17],[746,74],[770,464],[797,405],[706,419],[924,184],[805,804],[546,501],[938,697],[712,331],[869,745],[936,888],[843,508],[779,522],[716,653],[699,205],[755,462],[352,244],[944,723],[935,247],[738,624],[639,617],[909,531],[908,314],[350,294],[958,361],[903,286],[728,105],[912,431],[283,276],[389,124],[764,448],[847,738],[450,285],[940,810],[683,25],[661,324],[842,513],[956,321],[854,462],[544,311],[665,268],[788,237],[295,266],[474,277],[912,195],[817,542],[349,343],[338,306],[817,273],[809,189],[942,741],[236,109],[918,513],[164,123],[785,420],[763,55],[963,220],[782,26],[911,481],[537,15],[225,137],[711,563],[596,402],[373,202],[186,148],[774,481],[900,29],[543,514],[781,109],[632,566],[943,65],[930,62],[980,13],[815,157],[883,277],[669,291],[642,217],[328,31],[701,678],[165,129],[761,129],[222,19],[451,87],[810,269],[644,253],[810,491],[778,566],[868,21],[993,683],[749,471],[540,218],[490,347],[951,624],[911,377],[721,485],[652,131],[925,199],[690,233],[170,96],[734,114],[311,16],[533,431],[725,19],[584,566],[383,54],[759,734],[915,32],[624,401],[687,242],[356,322],[772,11],[707,559],[889,810],[495,168],[392,224],[799,675],[367,206],[787,99],[690,170],[910,290],[452,47],[431,350],[331,209],[949,844],[231,77],[740,36],[650,557],[739,514],[863,854],[805,497],[870,128],[511,95],[458,141],[653,29],[580,207],[864,290],[984,844],[821,749],[942,711],[223,211],[204,80],[955,815],[484,476],[732,438],[732,287],[180,146],[897,675],[661,537],[160,150],[778,270],[570,258],[564,526],[882,39],[863,324],[374,365],[543,541],[892,579],[649,246],[902,333],[949,851],[767,761],[772,177],[395,146],[911,40],[736,312],[698,510],[550,289],[873,746],[435,260],[196,179],[779,375],[463,400],[270,68],[808,398],[821,642],[998,638],[878,268],[925,47],[362,286],[993,776],[977,239],[382,123],[284,75],[426,408],[675,507],[881,31],[108,82],[79,54],[685,357],[983,963],[721,547],[834,491],[849,91],[828,283],[425,424],[970,124],[583,141],[914,2],[888,536],[356,302],[880,759],[799,62],[916,344],[902,22],[526,303],[827,757],[866,214],[621,348],[288,259],[580,185],[874,206],[810,665],[697,43],[890,811],[658,305],[718,325],[900,341],[871,713],[832,444],[653,101],[505,152],[767,750],[909,131],[643,374],[892,183],[709,365],[789,508],[504,318],[507,291],[893,482],[758,356],[826,681],[831,216],[454,384],[649,502],[445,280],[238,204],[436,269],[156,77],[576,41],[933,903],[889,599],[958,940],[483,326],[497,79],[675,588],[219,98],[926,801],[632,108],[715,221],[765,545],[47,11],[658,334],[395,26],[577,375],[809,262],[416,264],[641,153],[889,68],[446,445],[993,82],[764,207],[513,157],[893,266],[931,361],[499,322],[704,519],[959,301],[598,583],[732,42],[383,82],[591,353],[471,60],[684,642],[136,81],[841,100],[838,741],[827,210],[571,15],[893,232],[835,564],[566,256],[508,334],[971,572],[897,556],[405,51],[648,362],[734,237],[589,122],[979,694],[833,52],[359,78],[249,100],[887,454],[778,197],[951,350],[394,164],[391,118],[685,445],[547,204],[824,73],[374,52],[654,156],[773,360],[721,282],[158,24],[889,654],[999,195],[372,129],[594,585],[457,345],[330,148],[762,224],[415,357],[509,143],[488,72],[635,579],[533,293],[908,793],[932,204],[789,92],[891,288],[903,721],[704,60],[377,325],[839,117],[714,469],[445,274],[361,113],[366,104],[504,441],[313,85],[895,52],[553,408],[688,388],[890,223],[904,374],[398,357],[957,441],[932,842],[833,551],[553,452],[805,263],[550,215],[765,688],[801,9],[923,846],[747,691],[847,794],[723,366],[857,151],[908,275],[970,755],[273,109],[611,45],[587,571],[545,394],[700,89],[611,535],[994,80],[979,597],[648,212],[639,606],[611,365],[861,675],[682,371],[647,293],[608,458],[867,751],[846,295],[579,406],[994,56],[371,13],[522,26],[148,145],[706,685],[765,726],[783,24],[706,532],[283,203],[906,520],[936,63],[804,556],[571,371],[971,553],[988,448],[596,45],[844,151],[725,598],[751,592],[824,443],[805,328],[654,120],[794,755],[739,526],[747,257],[69,39],[274,237],[690,203],[443,269],[374,21],[875,138],[887,491],[380,99],[942,567],[906,481],[763,93],[607,159],[233,171],[955,132],[773,257],[679,268],[562,275],[712,136],[510,415],[871,647],[837,672],[816,1],[584,509],[862,367],[956,272],[942,818],[850,401],[977,248],[816,170],[941,855],[732,638],[890,313],[790,59],[863,715],[838,60],[296,66],[684,209],[736,37],[547,445],[887,869],[970,246],[627,409],[176,65],[737,253],[274,96],[805,724],[120,90],[429,309],[832,140],[613,175],[879,133],[856,403],[391,279],[727,133],[817,756],[875,799],[769,322],[785,221],[670,563],[555,425],[872,282],[816,178],[401,128],[892,557],[527,480],[934,312],[837,123],[598,265],[930,915],[802,585],[811,355],[839,709],[471,459],[95,81],[333,267],[806,6],[898,683],[936,737],[724,89],[870,154],[253,126],[123,73],[510,499],[801,296],[761,225],[993,728],[512,456],[594,76],[358,296],[490,328],[810,5],[570,510],[810,555],[924,537],[85,27],[894,199],[471,333],[655,328],[619,569],[511,226],[736,501],[448,345],[310,107],[799,238],[952,792],[868,379],[875,165],[826,470],[672,318],[909,585],[239,55],[545,429],[547,365],[872,758],[926,508],[111,15],[983,700],[761,658],[736,58],[522,395],[387,215],[377,207],[906,145],[860,373],[591,50],[563,73],[733,463],[680,364],[827,708],[913,894],[705,629],[876,548],[825,522],[587,321],[670,355],[200,150],[702,385],[525,331],[743,373],[471,23],[849,13],[816,574],[856,34],[808,557],[965,586],[841,141],[846,824],[952,356],[948,671],[473,308],[750,702],[468,338],[991,238],[806,256],[912,760],[631,521],[850,568],[439,139],[577,252],[412,192],[644,250],[962,82],[422,407],[302,128],[841,448],[960,736],[729,273],[749,746],[821,803],[330,139],[785,584],[580,297],[962,740],[489,341],[680,111],[578,522],[237,179],[490,288],[920,16],[401,45],[408,134],[620,508],[351,129],[867,416],[948,243],[746,254],[860,162],[834,273],[891,851],[513,119],[991,511],[695,640],[587,93],[644,254],[939,685],[997,432],[551,215],[719,364],[146,99],[656,416],[731,663],[773,321],[433,300],[620,122],[549,170],[450,271],[823,637],[850,45],[623,184],[680,596],[891,699],[557,172],[916,780],[691,454],[955,225],[769,72],[732,609],[813,641],[228,95],[946,202],[754,356],[270,215],[835,636],[935,241],[501,394],[740,328],[736,510],[641,83],[503,320],[519,233],[872,17],[383,14],[908,3],[804,217],[379,140],[734,313],[816,763],[917,573],[478,297],[404,104],[936,232],[682,376],[904,599],[974,845],[704,533],[840,698],[970,870],[914,701],[908,758],[634,263],[853,778],[810,19],[332,266],[950,221],[606,127],[580,142],[858,391],[431,276],[639,610],[843,354],[987,652],[697,306],[906,526],[990,545],[750,347],[599,269],[748,174],[960,670],[129,113],[882,428],[806,794],[428,411],[937,930],[795,475],[834,787],[522,411],[519,367],[775,33],[776,753],[782,80],[214,57],[949,713],[827,178],[968,219],[934,588],[910,130],[940,695],[366,3],[198,96],[938,230],[924,741],[481,21],[880,862],[981,395],[745,516],[981,691],[739,227],[373,185],[950,93],[526,480],[379,189],[965,101],[725,136],[331,223],[969,615],[126,13],[905,845],[871,303],[950,424],[967,404],[765,733],[569,518],[65,44],[737,412],[349,195],[455,390],[264,191],[604,20],[473,337],[179,65],[948,137],[218,56],[475,210],[992,972],[469,381],[477,389],[558,383],[834,58],[560,411],[634,295],[939,734],[923,100],[872,5],[578,211],[574,3],[760,68],[268,232],[639,21],[196,133],[784,596],[548,472],[138,81],[790,615],[905,376],[727,580],[437,56],[718,74],[207,184],[851,374],[729,592],[622,68],[759,755],[856,701],[751,535],[886,803],[801,11],[732,381],[987,216],[819,120],[665,308],[818,786],[367,243],[773,534],[992,192],[973,788],[966,392],[897,11],[852,490],[607,223],[930,754],[456,82],[894,746],[875,185],[913,424],[276,43],[561,427],[670,621],[214,161],[859,728],[999,229],[663,101],[209,193],[302,222],[743,153],[884,771],[722,622],[610,423],[989,683],[964,808],[351,328],[640,631],[802,383],[837,238],[677,27],[225,51],[992,92],[758,450],[817,391],[971,17],[250,191],[589,353],[749,689],[795,274],[145,135],[561,303],[894,328],[928,573],[162,36],[895,756],[787,327],[151,34],[847,681],[317,261],[905,673],[159,110],[207,93],[821,290],[611,376],[763,747],[900,597],[705,503],[793,275],[204,89],[971,45],[465,418],[148,35],[785,444],[966,698],[944,467],[437,288],[471,280],[788,242],[881,60],[650,57],[824,721],[745,131],[818,82],[546,282],[888,35],[526,450],[943,223],[872,553],[876,630],[611,414],[697,572],[635,50],[463,265],[429,387],[274,17],[898,754],[718,345],[463,349],[880,688],[680,117],[960,340],[599,201],[309,289],[904,736],[836,538],[596,417],[901,222],[454,21],[833,591],[362,280],[752,590],[907,805],[287,268],[902,46],[918,310],[953,234],[412,242],[438,121],[537,230],[704,158],[863,325],[263,29],[987,951],[868,257],[559,413],[264,17],[738,86],[617,467],[745,304],[931,585],[949,729],[681,677],[967,101],[826,112],[991,848],[668,24],[953,288],[506,446],[406,225],[646,346],[615,475],[660,601],[820,227],[971,879],[947,830],[964,228],[821,464],[115,40],[38,35],[716,638],[748,127],[378,338],[745,227],[603,235],[497,418],[910,526],[876,816],[833,714],[655,149],[926,761],[974,949],[964,202],[385,116],[891,99],[886,762],[886,823],[499,492],[643,230],[914,269],[957,147],[669,346],[932,697],[693,258],[746,597],[811,250],[400,46],[824,472],[701,247],[485,111],[299,75],[845,135],[204,16],[953,532],[261,223],[331,192],[301,59],[695,290],[896,139],[299,15],[819,763],[859,607],[670,270],[422,394],[797,594],[310,271],[674,575],[982,592],[106,4],[781,365],[710,603],[569,380],[995,307],[712,694],[930,507],[929,830],[308,3],[897,132],[669,424],[286,106],[917,520],[954,670],[448,258],[770,9],[853,41],[600,358],[403,265],[739,486],[674,207],[701,378],[630,285],[761,446],[578,511],[555,40],[771,563],[565,546],[940,497],[848,419],[990,820],[566,493],[310,246],[398,15],[950,708],[905,818],[613,34],[557,395],[401,298],[952,770],[933,425],[824,90],[693,260],[702,257],[990,857],[459,209],[573,152],[389,314],[999,888],[602,200],[855,63],[991,988],[411,342],[820,506],[360,131],[611,420],[670,452],[966,885],[815,287],[678,657],[891,827],[725,178],[876,177],[461,402],[555,51],[641,125],[807,447],[840,369],[526,95],[300,80],[978,837],[707,541],[983,541],[691,623],[527,320],[679,428],[618,472],[287,138],[598,17],[892,179],[637,89],[983,592],[289,56],[253,100],[900,396],[604,94],[810,51],[775,753],[623,391],[716,705],[981,226],[609,72],[578,143],[745,263],[975,144],[611,381],[932,772],[606,145],[831,551],[717,608],[890,310],[34,17],[401,200],[625,436],[548,332],[425,271],[646,372],[978,400],[862,573],[597,486],[992,805],[470,464],[821,780],[163,156],[821,794],[881,147],[248,122],[844,833],[587,84],[709,663],[937,222],[612,470],[777,416],[862,609],[366,302],[564,508],[414,13],[908,700],[419,96],[930,104],[398,231],[484,91],[250,205],[639,268],[333,198],[923,906],[296,262],[879,198],[970,56],[999,108],[299,47],[432,255],[577,184],[514,473],[654,612],[865,114],[987,799],[926,248],[798,429],[552,150],[820,176],[881,368],[990,43],[606,494],[884,616],[699,81],[572,195],[691,221],[978,563],[940,447],[752,346],[790,588],[987,656],[402,17],[851,122],[359,172],[780,209],[275,47],[580,120],[877,350],[788,758],[977,460],[933,771],[775,190],[938,866],[618,453],[218,60],[789,506],[767,323],[591,194],[281,194],[376,118],[663,282],[243,113],[709,70],[797,400],[903,187],[897,240],[262,159],[522,330],[992,838],[630,574],[998,421],[808,254],[514,325],[684,579],[403,127],[702,439],[500,264],[581,312],[620,292],[266,62],[455,341],[928,796],[896,31],[558,456],[505,123],[744,22],[794,281],[770,317],[796,277],[713,448],[976,421],[738,287],[958,639],[991,324],[951,819],[611,295],[738,435],[512,436],[846,6],[463,444],[438,56],[574,133],[310,9],[222,102],[979,342],[543,259],[969,622],[963,297],[251,37],[755,208],[806,28],[482,441],[323,113],[645,479],[540,405],[941,732],[994,822],[545,317],[738,605],[993,280],[727,603],[155,110],[437,38],[991,394],[653,112],[914,579],[219,18],[323,228],[882,41],[790,741],[967,623],[402,134],[964,657],[822,635],[538,532],[566,176],[480,218],[484,210],[786,350],[356,307],[961,936],[844,702],[723,310],[787,398],[352,215],[921,715],[944,461],[951,875],[709,142],[523,322],[679,38],[897,800],[806,700],[686,492],[723,530],[471,288],[566,207],[822,423],[700,112],[402,98],[567,63],[459,144],[893,700],[664,493],[756,305],[510,60],[736,15],[874,559],[354,151],[55,41],[905,774],[886,601],[846,505],[977,478],[820,241],[440,239],[838,329],[799,175],[526,41],[935,125],[302,91],[909,44],[871,138],[228,31],[270,177],[901,267],[880,24],[412,246],[885,383],[713,641],[337,213],[860,393],[786,53],[887,786],[258,32],[662,546],[753,226],[883,220],[549,17],[666,372],[507,290],[573,87],[738,119],[973,233],[606,525],[847,543],[828,625],[583,27],[598,183],[634,138],[333,233],[596,416],[886,851],[836,709],[938,620],[788,418],[603,545],[143,24],[733,540],[377,149],[572,486],[450,108],[614,329],[906,358],[958,599],[660,31],[820,432],[557,462],[941,536],[628,577],[822,506],[793,167],[814,94],[885,454],[859,155],[964,822],[950,485],[750,527],[518,341],[862,250],[471,227],[578,379],[264,197],[829,539],[719,578],[483,300],[319,227],[919,17],[306,220],[766,613],[758,11],[792,593],[905,770],[930,557],[999,67],[526,13],[28,10],[297,158],[990,411],[908,736],[93,72],[823,84],[497,444],[992,222],[459,30],[760,40],[87,34],[283,3],[107,88],[969,346],[969,408],[354,346],[836,322],[371,149],[613,480],[284,72],[451,422],[770,65],[393,343],[558,322],[843,9],[896,773],[766,56],[287,45],[919,433],[991,760],[975,200],[919,147],[937,31],[673,394],[771,743],[955,199],[277,116],[782,440],[688,115],[736,369],[772,232],[588,205],[910,545],[598,104],[881,144],[563,341],[386,248],[819,618],[894,717],[989,886],[853,366],[944,719],[901,568],[974,693],[626,498],[597,519],[260,134],[928,36],[306,263],[388,291],[588,128],[851,803],[700,649],[517,186],[406,75],[894,600],[846,541],[509,398],[919,687],[538,133],[412,255],[656,78],[660,434],[948,44],[771,709],[947,77],[322,140],[544,357],[714,667],[825,293],[448,408],[838,317],[203,86],[968,361],[681,617],[613,520],[331,172],[270,131],[944,599],[821,358],[891,753],[935,297],[705,683],[607,264],[805,430],[812,495],[451,440],[445,417],[631,413],[489,127],[879,44],[692,571],[759,752],[704,429],[497,330],[913,678],[947,426],[504,188],[577,250],[949,637],[562,445],[352,5],[719,530],[512,375],[613,392],[202,114],[772,368],[720,667],[847,565],[432,184],[405,387],[434,60],[767,185],[723,197],[899,527],[459,222],[914,14],[873,129],[387,131],[910,442],[783,565],[660,202],[749,353],[587,468],[519,56],[871,777],[698,347],[457,333],[691,393],[841,131],[685,4],[265,145],[988,515],[216,91],[778,131],[750,734],[501,10],[991,656],[749,596],[983,672],[722,314],[552,318],[683,40],[912,859],[755,652],[516,130],[678,88],[387,303],[845,553],[962,795],[909,282],[427,227],[932,721],[705,703],[314,289],[829,349],[835,802],[781,527],[221,8],[925,140],[843,443],[751,30],[759,478],[962,768],[209,14],[632,562],[472,315],[392,286],[830,365],[898,881],[595,244],[851,748],[674,57],[871,109],[609,327],[964,128],[456,318],[701,487],[652,477],[393,120],[399,349],[265,125],[994,975],[490,326],[465,224],[587,276],[712,314],[576,131],[607,110],[750,14],[782,495],[972,473],[992,377],[424,16],[434,298],[840,666],[984,503],[522,262],[757,365],[787,614],[728,427],[859,379],[955,57],[398,8],[972,746],[778,766],[803,497],[626,267],[739,131],[218,30],[309,12],[783,596],[964,837],[722,138],[537,60],[568,542],[662,157],[653,217],[752,56],[793,413],[732,296],[992,749],[193,191],[878,874],[559,363],[524,23],[455,183],[656,585],[854,508],[618,276],[471,235],[750,298],[979,161],[645,5],[880,612],[821,259],[906,292],[880,470],[786,558],[490,307],[922,144],[403,182],[617,503],[866,451],[747,652],[579,364],[838,85],[676,417],[658,87],[787,67],[950,41],[472,275],[556,348],[615,392],[763,542],[668,323],[864,91],[957,351],[411,403],[677,267],[714,311],[683,228],[433,381],[826,305],[433,179],[428,278],[715,45],[417,122],[852,711],[599,408],[793,328],[214,150],[681,529],[44,11],[482,54],[616,322],[921,74],[475,378],[529,157],[922,190],[200,72],[561,333],[364,235],[900,819],[721,123],[240,93],[930,533],[606,73],[644,466],[943,13],[612,407],[758,679],[838,5],[884,381],[117,94],[823,4],[394,113],[621,83],[712,408],[897,595],[464,48],[244,181],[232,44],[994,489],[902,90],[841,731],[374,100],[950,753],[585,504],[449,320],[591,584],[752,471],[883,881],[990,516],[809,633],[774,109],[780,50],[833,592],[675,323],[745,403],[941,926],[984,135],[481,285],[770,405],[339,237],[636,70],[769,764],[573,529],[173,122],[559,207],[959,820],[855,235],[589,499],[977,324],[610,42],[953,244],[784,656],[651,60],[580,390],[811,539],[888,886],[513,219],[709,334],[795,234],[709,540],[490,445],[894,245],[576,128],[675,397],[415,346],[679,657],[707,680],[727,623],[811,177],[968,247],[993,699],[173,17],[710,408],[932,727],[642,636],[414,6],[908,364],[565,311],[663,27],[592,290],[685,431],[578,549],[897,818],[678,625],[927,913],[195,126],[576,277],[962,669],[524,511],[865,196],[963,564],[643,205],[496,123],[781,34],[960,441],[498,175],[919,626],[597,203],[307,267],[22,3],[252,33],[637,626],[469,220],[773,74],[915,781],[606,545],[963,571],[978,528],[536,232],[682,280],[162,31],[964,727],[832,231],[671,40],[943,931],[578,439],[630,463],[998,935],[977,61],[393,387],[281,267],[851,546],[453,282],[662,568],[855,179],[508,224],[779,767],[951,155],[480,103],[876,871],[970,487],[412,190],[889,586],[916,164],[986,332],[555,83],[744,124],[884,658],[614,72],[98,90],[855,850],[988,548],[861,8],[915,59],[868,105],[612,547],[835,254],[702,529],[715,367],[262,134],[588,492],[565,156],[783,318],[935,502],[455,188],[722,633],[860,104],[654,362],[317,75],[643,561],[991,135],[857,187],[813,758],[435,404],[110,106],[439,76],[917,11],[543,171],[768,671],[992,746],[415,48],[415,240],[950,354],[933,531],[727,452],[164,143],[704,391],[419,366],[405,354],[458,75],[741,3],[855,21],[795,206],[726,506],[507,171],[978,127],[716,45],[561,162],[285,232],[771,495],[195,175],[866,596],[516,264],[156,102],[361,92],[915,578],[389,280],[719,685],[700,118],[858,473],[960,497],[772,51],[829,654],[755,446],[415,86],[555,323],[222,130],[883,322],[568,417],[532,526],[237,33],[752,381],[378,203],[297,43],[259,95],[454,84],[449,187],[873,793],[348,245],[936,147],[525,507],[948,143],[565,326],[849,239],[973,813],[414,177],[238,74],[528,275],[713,500],[252,239],[882,488],[880,804],[703,366],[978,347],[516,356],[957,179],[369,50],[531,461],[508,291],[184,132],[755,23],[850,816],[852,341],[937,413],[860,743],[916,379],[635,223],[107,62],[967,922],[876,158],[363,86],[778,505],[695,297],[492,23],[367,349],[857,290],[895,839],[104,76],[867,210],[845,523],[652,229],[521,214],[267,96],[91,63],[440,388],[696,261],[203,45],[60,57],[255,50],[741,616],[648,408],[307,201],[645,544],[359,349],[620,124],[391,300],[519,384],[706,683],[988,189],[824,797],[661,501],[775,527],[363,354],[852,803],[896,885],[583,109],[859,389],[739,162],[709,671],[553,334],[990,501],[958,708],[579,100],[659,455],[947,629],[975,922],[558,225],[675,108],[713,676],[637,481],[896,747],[862,297],[607,83],[765,231],[986,573],[682,263],[577,88],[906,456],[858,102],[181,45],[372,170],[782,349],[496,159],[630,415],[358,153],[48,17],[848,545],[974,856],[798,215],[790,245],[974,55],[951,586],[791,55],[428,206],[994,825],[356,9],[951,254],[749,620],[918,686],[606,476],[293,20],[156,115],[678,278],[821,78],[775,152],[525,27],[705,112],[850,550],[294,167],[537,185],[413,66],[723,167],[822,340],[727,194],[630,54],[373,77],[562,419],[90,37],[823,234],[757,388],[904,147],[133,80],[801,523],[669,666],[146,131],[543,53],[603,37],[513,486],[599,197],[495,439],[551,303],[982,843],[726,462],[632,441],[394,188],[481,39],[379,154],[838,607],[681,65],[885,807],[999,898],[909,82],[367,152],[297,279],[341,119],[268,211],[469,256],[875,537],[768,753],[814,464],[868,299],[978,847],[740,629],[430,116],[866,125],[398,313],[907,761],[754,469],[919,86],[592,6],[902,529],[302,259],[864,76],[361,328],[507,116],[907,623],[353,275],[781,429],[972,574],[580,558],[519,249],[670,61],[760,201],[897,891],[528,273],[721,608],[916,200],[870,737],[434,131],[73,71],[846,0],[683,373],[802,35],[882,67],[862,697],[565,507],[995,43],[722,572],[605,319],[447,91],[850,265],[702,654],[214,189],[430,29],[788,199],[801,312],[552,250],[912,81],[288,185],[966,347],[961,390],[790,186],[693,571],[947,688],[550,230],[251,193],[847,180],[885,823],[876,208],[781,714],[890,557],[626,300],[681,496],[759,750],[244,220],[991,581],[844,120],[912,553],[709,472],[610,209],[754,87],[424,151],[739,156],[665,538],[184,168],[527,377],[869,408],[463,16],[531,40],[167,7],[721,365],[307,144],[407,380],[635,307],[420,140],[995,215],[972,899],[611,138],[613,466],[759,201],[588,90],[952,748],[410,91],[830,109],[850,590],[936,269],[890,389],[862,40],[398,54],[972,230],[875,474],[986,643],[436,141],[359,347],[839,452],[673,39],[646,610],[517,406],[519,229],[329,153],[637,552],[540,104],[668,65],[364,228],[694,420],[978,270],[352,184],[949,700],[243,1],[435,345],[832,780],[617,381],[604,115],[284,225],[924,504],[997,530],[389,231],[944,436],[523,173],[536,323],[486,10],[591,130],[848,320],[737,60],[682,86],[864,43],[711,436],[620,234],[796,507],[363,210],[954,403],[886,727],[839,617],[954,762],[633,385],[621,168],[403,332],[588,578],[368,271],[905,454],[936,416],[990,628],[605,558],[462,176],[552,183],[740,647],[827,378],[682,384],[991,449],[700,345],[188,21],[725,206],[842,414],[774,559],[723,253],[577,451],[216,127],[860,236],[507,111],[731,423],[399,156],[566,89],[170,65],[234,169],[421,253],[712,457],[901,836],[660,436],[631,88],[393,31],[438,115],[612,434],[973,965],[77,71],[859,243],[975,123],[859,367],[768,365],[626,263],[941,243],[862,282],[413,259],[649,143],[94,37],[536,522],[916,698],[777,47],[571,71],[580,519],[703,44],[117,4],[828,798],[830,64],[454,392],[566,142],[526,215],[931,250],[658,294],[751,531],[911,160],[765,747],[890,126],[913,461],[922,284],[872,704],[161,137],[439,175],[499,286],[592,456],[499,10],[891,169],[382,117],[786,199],[932,836],[953,323],[841,138],[829,625],[964,541],[504,398],[857,759],[826,129],[602,343],[706,240],[995,525],[340,127],[619,584],[888,818],[676,633],[459,437],[645,373],[603,406],[985,321],[336,240],[902,829],[527,519],[895,423],[910,288],[917,684],[801,665],[292,225],[290,124],[897,614],[679,66],[355,197],[976,380],[824,315],[549,522],[777,93],[826,595],[947,448],[441,284],[292,210],[808,694],[383,295],[882,408],[433,263],[605,82],[729,362],[787,47],[274,183],[855,486],[269,245],[727,469],[895,61],[765,245],[915,177],[831,428],[841,55],[703,601],[826,10],[316,157],[888,101],[498,226],[876,742],[867,250],[731,192],[653,591],[705,105],[916,889],[966,54],[958,571],[547,261],[907,831],[504,310],[754,698],[399,323],[649,456],[743,655],[126,45],[889,872],[645,446],[452,102],[307,121],[915,766],[630,352],[965,383],[695,328],[401,272],[935,156],[381,310],[698,130],[827,27],[889,425],[748,120],[755,220],[645,507],[601,10],[707,90],[846,410],[745,690],[991,765],[301,180],[779,195],[755,29],[950,704],[970,259],[383,289],[625,278],[758,421],[762,531],[559,342],[625,265],[589,491],[396,134],[828,30],[965,68],[667,197],[477,370],[915,589],[988,669],[495,146],[740,661],[964,324],[431,421],[825,28],[681,150],[935,182],[743,648],[291,125],[852,753],[573,543],[518,355],[121,34],[680,592],[665,183],[930,478],[854,769],[695,375],[537,81],[523,455],[442,212],[827,153],[367,65],[591,182],[944,203],[490,57],[995,221],[556,303],[564,127],[353,242],[662,549],[847,48],[626,592],[797,682],[710,335],[952,196],[801,321],[833,452],[106,23],[564,232],[279,247],[973,191],[875,239],[720,179],[700,253],[976,61],[622,352],[980,876],[446,2],[785,442],[796,448],[399,26],[693,618],[764,667],[632,444],[779,559],[550,1],[843,477],[438,193],[956,866],[261,12],[725,390],[652,239],[523,8],[415,20],[949,838],[552,323],[772,163],[997,175],[933,231],[284,248],[592,139],[133,92],[481,187],[732,329],[821,784],[895,654],[882,345],[405,382],[669,579],[730,200],[516,473],[279,269],[956,679],[901,552],[925,560],[812,624],[705,588],[344,167],[479,18],[763,711],[851,263],[534,32],[462,443],[809,324],[446,131],[699,138],[553,444],[381,104],[726,718],[839,361],[920,272],[980,281],[581,315],[490,20],[381,330],[713,354],[816,43],[854,590],[629,378],[770,152],[712,393],[642,477],[628,368],[396,359],[581,510],[714,61],[652,375],[696,303],[627,530],[158,94],[341,157],[876,41],[941,494],[651,285],[950,106],[803,360],[586,458],[524,448],[870,348],[538,55],[703,31],[731,407],[620,157],[798,301],[479,394],[69,1],[867,786],[702,671],[421,267],[690,573],[578,249],[945,536],[635,524],[712,514],[311,150],[505,246],[877,398],[672,608],[350,170],[484,481],[671,606],[850,148],[830,316],[557,529],[706,72],[886,579],[634,492],[879,119],[797,596],[882,686],[116,46],[850,807],[855,530],[831,16],[677,461],[546,407],[978,583],[870,551],[549,535],[341,82],[864,668],[770,330],[223,2],[748,83],[908,410],[988,980],[173,105],[217,48],[830,594],[780,389],[958,770],[920,497],[626,17],[466,1],[448,190],[298,202],[242,55],[796,607],[986,290],[169,160],[543,35],[940,165],[938,418],[769,504],[329,325],[119,71],[270,27],[899,597],[977,143],[732,60],[784,284],[595,334],[927,865],[283,63],[785,661],[938,109],[737,717],[396,56],[771,31],[911,305],[570,259],[506,48],[986,819],[892,864],[141,130],[962,188],[622,26],[815,347],[741,62],[514,277],[886,755],[420,12],[197,136],[466,171],[442,103],[457,277],[678,18],[980,461],[629,177],[644,162],[826,152],[593,298],[537,180],[711,323],[113,103],[302,141],[928,634],[838,48],[498,279],[454,239],[473,214],[861,621],[902,263],[969,90],[477,132],[998,713],[828,559],[610,536],[433,70],[862,302],[663,479],[344,83],[611,107],[956,468],[749,628],[271,262],[557,476],[734,606],[661,306],[547,538],[801,488],[877,445],[342,22],[519,419],[910,524],[934,670],[985,197],[439,436],[819,770],[555,455],[789,267],[531,57],[980,175],[927,258],[832,104],[649,393],[486,427],[902,788],[897,823],[527,337],[600,31],[469,326],[769,286],[314,191],[422,354],[594,369],[104,88],[382,369],[825,321],[223,84],[728,379],[748,315],[650,354],[256,130],[903,428],[182,148],[719,707],[710,18],[648,131],[879,235],[913,163],[907,155],[440,104],[829,437],[524,178],[598,458],[20,5],[269,74],[963,114],[314,207],[659,445],[632,588],[280,115],[120,84],[853,252],[923,835],[922,98],[789,19],[835,471],[868,435],[855,824],[103,102],[883,347],[833,204],[836,351],[527,86],[695,481],[701,567],[759,383],[801,795],[834,417],[923,422],[920,508],[789,271],[794,480],[566,526],[950,64],[355,231],[346,193],[934,704],[883,854],[371,0],[686,114],[942,725],[523,266],[705,65],[647,522],[784,683],[593,44],[694,501],[348,59],[644,266],[646,14],[969,380],[592,135],[306,80],[761,652],[596,84],[999,795],[790,179],[749,365],[871,504],[809,3],[934,411],[600,20],[783,637],[555,380],[980,93],[396,251],[984,280],[381,111],[615,96],[507,389],[885,101],[724,30],[441,358],[692,7],[649,168],[942,751],[415,125],[850,768],[850,745],[719,90],[653,442],[556,555],[689,461],[171,11],[797,120],[485,245],[834,650],[859,732],[795,735],[863,98],[707,577],[707,592],[978,790],[222,18],[900,778],[799,663],[788,143],[911,268],[958,491],[530,27],[851,635],[662,366],[425,334],[107,11],[398,188],[888,436],[795,289],[875,406],[354,157],[869,819],[802,377],[579,260],[775,768],[921,276],[793,547],[890,532],[490,468],[724,330],[444,112],[960,857],[995,258],[893,153],[413,294],[615,490],[944,27],[953,223],[658,300],[426,388],[965,491],[762,127],[612,385],[886,692],[744,408],[500,265],[824,646],[945,818],[826,214],[936,700],[376,212],[823,375],[811,428],[346,343],[847,566],[410,276],[192,61],[281,15],[944,488],[575,246],[867,855],[785,343],[783,550],[938,422],[181,88],[545,36],[715,73],[499,473],[745,459],[913,412],[575,296],[867,216],[670,550],[736,622],[847,684],[382,238],[546,419],[985,973],[980,912],[945,330],[573,354],[808,787],[664,376],[894,461],[327,54],[466,57],[840,324],[986,376],[79,6],[317,247],[877,86],[256,112],[811,527],[740,678],[966,481],[731,696],[780,532],[894,869],[257,109],[286,180],[898,823],[908,838],[570,317],[941,911],[176,50],[488,364],[801,65],[789,435],[886,12],[997,292],[858,120],[217,167],[355,64],[944,273],[184,75],[565,328],[495,365],[670,446],[795,317],[262,247],[455,422],[633,236],[595,190],[863,131],[487,25],[810,402],[785,374],[557,306],[420,77],[994,916],[585,535],[682,646],[872,785],[922,916],[918,343],[918,109],[813,189],[832,535],[518,94],[993,2],[984,38],[576,256],[758,641],[675,269],[829,388],[862,216],[703,155],[729,548],[838,571],[830,325],[644,202],[459,257],[650,211],[280,234],[697,153],[870,290],[421,168],[982,466],[690,651],[775,667],[277,99],[875,853],[268,29],[627,464],[886,283],[558,421],[987,113],[34,6],[333,94],[439,222],[693,408],[710,607],[766,736],[865,594],[570,316],[897,603],[929,132],[932,245],[810,413],[111,89],[607,54],[825,502],[183,42],[306,222],[807,503],[744,313],[564,259],[330,93],[638,496],[482,469],[541,86],[663,85],[609,258],[921,275],[928,86],[943,161],[533,99],[773,96],[517,359],[560,465],[763,13],[749,232],[561,492],[412,360],[708,561],[405,95],[793,383],[600,124],[911,438],[913,693],[477,433],[938,630],[622,572],[237,190],[567,226],[28,3],[307,108],[584,260],[238,232],[420,355],[641,516],[866,524],[828,266]], + }, +}; diff --git a/lab/exercises/10-mixed/critical-connections.js b/lab/exercises/10-mixed/critical-connections.js new file mode 100644 index 00000000..0544807d --- /dev/null +++ b/lab/exercises/10-mixed/critical-connections.js @@ -0,0 +1,54 @@ +/** + * @param {number} n + * @param {number[][]} connections + * @return {number[][]} + */ +function criticalConnections(n, connections) { + const graph = buildGraph(n, connections); + // console.log({graph}) + + return dfs(graph, 0); +} + + +function buildGraph(n, connections) { + const graph = [...Array(n).keys()].reduce((map, i) => { + map.set(i, new Set()); + return map; + }, new Map()); + + connections.forEach(([i, j]) => { + const iAdj = graph.get(i); + iAdj.add(j); + const jAdj = graph.get(j); + jAdj.add(i); + }); + + return graph; +} + +function dfs(graph, current, previous = null, rank = 1, group = []) { + let criticalLinks = []; + group[current] = rank; + + for (const adj of graph.get(current)) { + if (adj === previous) continue; + + if (!group[adj]) { // if not visited (and not in a group yet) + const links = dfs(graph, adj, current, rank + 1, group); + if (links.length) { + criticalLinks = criticalLinks.concat(links); + } + } + + group[current] = Math.min(group[current], group[adj]); + + if (group[adj] >= rank + 1) { + criticalLinks.push([current, adj]); + } + } + + return criticalLinks; +} + +module.exports = criticalConnections; diff --git a/lab/exercises/10-mixed/critical-connections.runner.js b/lab/exercises/10-mixed/critical-connections.runner.js new file mode 100644 index 00000000..9e682474 --- /dev/null +++ b/lab/exercises/10-mixed/critical-connections.runner.js @@ -0,0 +1,17 @@ +const assert = require('assert'); + +// const criticalConnections = require('./critical-connections'); +const criticalConnections = require('./critical-connections'); +const data = require('./critical-connections.data'); + +assert.deepEqual(criticalConnections(4, [ + [0, 1], + [1, 2], + [2, 0], + [1, 3], +]), [[1, 3]]); + +const { n, connections } = data.test1000; +assert.deepEqual(criticalConnections(n, connections), []); + +console.log('All tests passed!'); diff --git a/lab/exercises/10-mixed/critical-connections.spec.js b/lab/exercises/10-mixed/critical-connections.spec.js new file mode 100644 index 00000000..c07f4f41 --- /dev/null +++ b/lab/exercises/10-mixed/critical-connections.spec.js @@ -0,0 +1,42 @@ +// npx jest lab/exercises/10-mixed/critical-connections.spec.js --watch +const criticalConnections = require('./critical-connections'); + +describe('Critical Connections', () => { + it('should work with 4 nodes', () => { + const n = 4; + const connections = [ + [0, 1], + [1, 2], + [2, 0], + [1, 3], + ]; + expect(criticalConnections(n, connections)).toEqual([ + [1, 3], + ]); + }); + + it('should work with nodes in line (all critical)', () => { + const n = 4; + const connections = [ + [0, 1], + [1, 2], + [2, 3], + ]; + expect(criticalConnections(n, connections)).toEqual(expect.arrayContaining([ + [0, 1], + [1, 2], + [2, 3], + ])); + }); + + it('should work with nodes in daisy chain (no critical)', () => { + const n = 4; + const connections = [ + [0, 1], + [1, 2], + [2, 3], + [3, 0], + ]; + expect(criticalConnections(n, connections)).toEqual(expect.arrayContaining([])); + }); +}); diff --git a/lab/exercises/10-mixed/critical-routers.js b/lab/exercises/10-mixed/critical-routers.js new file mode 100644 index 00000000..d112b1f9 --- /dev/null +++ b/lab/exercises/10-mixed/critical-routers.js @@ -0,0 +1,77 @@ +/** + * Given a list of router links, find the routers that are critical to maintain communication. + * A router is considered critical if when they are removed, + * other routers lose connection to other routers different from the one removed. + * + * @runtime O(|E| * |V|^3) + * @space O(|E| + |V|) + * @pomodoro IIII (2h) + * + * @param {number} numRouters - The number of routers connected in a data center >= 3. + * @param {number} numLinks - The number of links. + * @param {[[number, number]]} links - The pair of routers connected by the link. + * @return {number[]} - The list of critical routers; + */ +function criticalRouters(numRouters, numLinks, links) { + const graph = buildGraph(numRouters, links); + const critical = []; + + // console.log({graph}); + + for (let curr = 1; curr <= numRouters; curr++) { + if (isCritical(graph, curr)) { + critical.push(curr); + } + } + + return critical; +} + +function isCritical(graph, curr) { + for (let i = 1; i <= graph.size; i++) { + for (let j = 1; j <= graph.size; j++) { + if (curr === i || curr === j || i === j) { continue; } + if (!isConnected(graph, i, j, curr)) { + return true; + } + } + } + return false; +} + +function addEdge(graph, from, to) { + // console.log('addEdge', {graph, from, to}); + const adjacents = graph.get(from); + adjacents.add(to); +} + +function buildGraph(numRouters, links) { + // console.log('buildGraph', { numRouters, links }); + const graph = new Map(); + const routers = [...Array(numRouters).keys()].map(r => r + 1); + routers.forEach(r => graph.set(r, new Set())); + + links.forEach(([from, to]) => { + addEdge(graph, from, to); + addEdge(graph, to, from); + }); + + return graph; +} + +function isConnected(graph, i, j, ignore, visited = new Set()) { + if (i === ignore || j === ignore) return false; + if (graph.get(i).has(j)) return true; + + for (const adj of graph.get(i)) { + if (visited.has(adj)) { continue; } + visited.add(adj); + if (isConnected(graph, adj, j, ignore, visited)) { + return true; + } + } + + return false; +} + +module.exports = criticalRouters; diff --git a/lab/exercises/10-mixed/critical-routers.spec.js b/lab/exercises/10-mixed/critical-routers.spec.js new file mode 100644 index 00000000..c4ec5597 --- /dev/null +++ b/lab/exercises/10-mixed/critical-routers.spec.js @@ -0,0 +1,64 @@ +// npx jest lab/exercises/10-mixed/critical-routers.spec.js --watch +const critialRouters = require('./critical-routers'); + +describe('Critical Routers', () => { + it('should work with daisy chain nodes', () => { + const numRouters = 3; + const numLinks = 3; + const links = [ + [1, 2], + [2, 3], + [3, 1], + ]; + expect(critialRouters(numRouters, numLinks, links)).toEqual([]); + }); + + it('should work with 7 nodes', () => { + const numRouters = 7; + const numLinks = 7; + const links = [ + [1, 2], + [1, 3], + [2, 4], + [3, 4], + [3, 6], + [6, 7], + [4, 5], + ]; + expect(critialRouters(numRouters, numLinks, links)).toEqual([3, 4, 6]); + }); + + it('should work with 6 nodes', () => { + const numRouters = 6; + const numLinks = 5; + const links = [ + [1, 2], + [2, 3], + [3, 4], + [4, 5], + [3, 6], + ]; + expect(critialRouters(numRouters, numLinks, links)).toEqual([2, 3, 4]); + }); + + it('should work with 10 nodes', () => { + const numRouters = 10; + const numLinks = 13; + const links = [ + [1, 2], + [1, 3], + [2, 3], + [3, 4], + [4, 5], + [4, 6], + [5, 6], + [5, 7], + [6, 7], + [7, 8], + [8, 9], + [8, 10], + [9, 10], + ]; + expect(critialRouters(numRouters, numLinks, links)).toEqual([3, 4, 7, 8]); + }); +}); diff --git a/lab/exercises/10-mixed/even-first.js b/lab/exercises/10-mixed/even-first.js new file mode 100644 index 00000000..ec08097c --- /dev/null +++ b/lab/exercises/10-mixed/even-first.js @@ -0,0 +1,15 @@ +function sortArrayByParity(A) { + let lo = 0; + let hi = A.length - 1; + while (lo < hi) { + if (A[lo] % 2 === 0) { + lo++; + } else { + [A[hi], A[lo]] = [A[lo], A[hi]]; + hi--; + } + } + return A; +} + +module.exports = sortArrayByParity; diff --git a/lab/exercises/10-mixed/even-first.spec.js b/lab/exercises/10-mixed/even-first.spec.js new file mode 100644 index 00000000..e0fc5e2e --- /dev/null +++ b/lab/exercises/10-mixed/even-first.spec.js @@ -0,0 +1,20 @@ +const fn = require('./even-first'); + +describe('Sort even first and then odd', () => { + it('should work when start with even', () => { + const actual = fn([0, 1, 2]); + expect(actual.slice(0, 2)).toEqual(expect.arrayContaining([0, 2])); + expect(actual.slice(2)).toEqual(expect.arrayContaining([1])); + }); + + it('should work when start with odd', () => { + const actual = fn([5, 4, 3, 7, 8, 3, 2]); + expect(actual.slice(0, 3)).toEqual(expect.arrayContaining([4, 8, 2])); + expect(actual.slice(3)).toEqual(expect.arrayContaining([5, 3, 7, 3])); + }); + + it('should work with empty', () => { + const actual = fn([]); + expect(actual).toEqual([]); + }); +}); diff --git a/lab/exercises/10-mixed/get-temperature-api.js b/lab/exercises/10-mixed/get-temperature-api.js new file mode 100644 index 00000000..c6be4cdf --- /dev/null +++ b/lab/exercises/10-mixed/get-temperature-api.js @@ -0,0 +1,29 @@ +// simulation of window.fetch +async function fetch(url) { + let temp = 4; + if (!url || !url.length) return Promise.reject(new Error(`Invalid URL ${url}.`)); + if (/7836/.test(url)) temp = 42.12; + if (/783e/.test(url)) temp = 42.1; + if (/7833/.test(url)) temp = 42; + return { + json: () => ({ temp }), + }; +} + +async function getTemperature(urls) { + try { + const res = await fetch(urls[0]); + const json = await res.json(); + return json.temp; + } catch (error) { + return Promise.reject(error); + } + // return new Promise((resolve, reject) => { + // fetch(urls[0]) + // .then((res) => res.json()) + // .then((json) => resolve(json.temp)) + // .catch(reject); + // }); +} + +module.exports = getTemperature; diff --git a/lab/exercises/10-mixed/get-temperature-api.spec.js b/lab/exercises/10-mixed/get-temperature-api.spec.js new file mode 100644 index 00000000..bd57d37f --- /dev/null +++ b/lab/exercises/10-mixed/get-temperature-api.spec.js @@ -0,0 +1,15 @@ +const fn = require('./get-temperature-api'); + +describe('Get Temperature from flaky API', () => { + it('should work', (done) => { + const urls = [ + '//www.mocky.io/v2/5e9ee4862d00000d00cb7836', // 42.12 + '//www.mocky.io/v2/5e9ee4f52d00000d00cb783e', // 42.1 + '//www.mocky.io/v2/5e9ee4702d00005a00cb7833', // 42 + ]; + fn(urls).then((res) => { + expect(res).toEqual(42.12); + done(); + }).catch(done); + }); +}); diff --git a/lab/exercises/10-mixed/integer-to-words.js b/lab/exercises/10-mixed/integer-to-words.js new file mode 100644 index 00000000..b550539a --- /dev/null +++ b/lab/exercises/10-mixed/integer-to-words.js @@ -0,0 +1,48 @@ +// nodemon lab/exercises/10-mixed/integer-to-words.spec-assert.js +// npx jest lab/exercises/10-mixed/integer-to-words.spec.js --watch +const UPTO20 = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty"] +const TENS = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"]; +const HUNDREDS = new Map([ + [1_000_000_000, 'Billion'], + [1_000_000, 'Million'], + [1_000, 'Thousand'], + [100, 'Hundred'], +]); + +/** + * You are creating a basic number-to-speech algorithms to use at Google. + * The first part is to convert a given number into its text representation. + * The 2nd part, is to take that text and synthetize the voice. + * We are going to focus on the first part for this exercise. + * + * Convert a positive integer into its English words representation. + * + * @param {number} num - The positive integer. Should be <= 2^31 - 1 + * @return {string} - The English words for the given number + * + * @author Adrian Mejia + */ +function numberToWords(num) { + if (num < 21) return UPTO20[num]; + + let ans = ''; + + for (const [div, word] of HUNDREDS.entries()) { + if (Math.floor(num/div)) { + ans += `${ numberToWords(Math.floor(num/div)) } `; + ans += `${ word } `; + num %= div; + } + } + + if (num && num < 21) { + ans += UPTO20[num] + ' '; + } else { + if (Math.floor(num/10)) ans += `${ TENS[Math.floor(num/10)] } `; + if (Math.floor(num % 10)) ans += `${ UPTO20[Math.floor(num % 10)] } `; + } + + return ans.trim(); +}; + +module.exports = numberToWords; diff --git a/lab/exercises/10-mixed/integer-to-words.spec-assert.js b/lab/exercises/10-mixed/integer-to-words.spec-assert.js new file mode 100644 index 00000000..f6ec04e2 --- /dev/null +++ b/lab/exercises/10-mixed/integer-to-words.spec-assert.js @@ -0,0 +1,27 @@ +/*eslint-disable */ +const assert = require('assert'); + +const numberToWords = require('./integer-to-words'); +const W9 = 'Nine Hundred Ninety Nine'; + +assert.equal(numberToWords(0), 'Zero'); +assert.equal(numberToWords(1), 'One'); +assert.equal(numberToWords(20), 'Twenty'); +assert.equal(numberToWords(21), 'Twenty One'); +assert.equal(numberToWords(99), 'Ninety Nine'); +assert.equal(numberToWords(100), 'One Hundred'); +assert.equal(numberToWords(101), 'One Hundred One'); +assert.equal(numberToWords(110), 'One Hundred Ten'); +assert.equal(numberToWords(111), 'One Hundred Eleven'); +assert.equal(numberToWords(777), 'Seven Hundred Seventy Seven'); +assert.equal(numberToWords(999), W9); +assert.equal(numberToWords(1_000), 'One Thousand'); +assert.equal(numberToWords(9999), `Nine Thousand ${W9}`); +assert.equal(numberToWords(1_000_000), 'One Million'); +assert.equal(numberToWords(1_234_567), 'One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven'); +assert.equal(numberToWords(999_999_999), `${W9} Million ${W9} Thousand ${W9}`); +assert.equal(numberToWords(1_234_567_891), `One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One`); +assert.equal(numberToWords(999_999_999_999), `${W9} Billion ${W9} Million ${W9} Thousand ${W9}`); +assert.equal(numberToWords(2**31 - 1), `Two Billion One Hundred Forty Seven Million Four Hundred Eighty Three Thousand Six Hundred Forty Seven`); + +console.log('All tests passed!'); diff --git a/lab/exercises/10-mixed/integer-to-words.spec.js b/lab/exercises/10-mixed/integer-to-words.spec.js new file mode 100644 index 00000000..922ec6e4 --- /dev/null +++ b/lab/exercises/10-mixed/integer-to-words.spec.js @@ -0,0 +1,9 @@ +// npx jest lab/exercises/10-mixed/integer-to-words.spec.js --watch + +const numberToWords = require('./integer-to-words'); + +describe('Integer to English Words', () => { + it('should convert 0', () => { + expect(numberToWords(0)).toEqual('Zero'); + }); +}); diff --git a/lab/exercises/10-mixed/network-delay-time-0.js b/lab/exercises/10-mixed/network-delay-time-0.js new file mode 100644 index 00000000..1dc33de4 --- /dev/null +++ b/lab/exercises/10-mixed/network-delay-time-0.js @@ -0,0 +1,42 @@ +/** + * @param {number[][]} times + * @param {number} N + * @param {number} K + * @return {number} + */ +function networkDelayTime(times, N, K) { + const graph = new Map(); + for (let i = 1; i <= N; i++) graph.set(i, []); + times.forEach(([u, v, w]) => { + graph.get(u).push([v, w]); + }); + + + const distances = Array(N + 1).fill(Infinity); + distances[0] = 0; + distances[K] = 0; + + const visited = []; + + const queue = new Map([[K, 0]]); + + while (queue.size) { + const [node, dist] = queue.entries().next().value; + queue.delete(node); + + visited[node] = true; + + // not working for some cases + graph.get(node).sort((a, b) => a[1] - b[1]).forEach(([n, w]) => { + distances[n] = Math.min(distances[n], dist + w); + if (queue.has(n) || !visited[n]) { + queue.set(n, distances[n]); + } + }); + } + + const max = Math.max(...distances); + return max === Infinity ? -1 : max; +} + +module.exports = networkDelayTime; diff --git a/lab/exercises/10-mixed/network-delay-time-1.js b/lab/exercises/10-mixed/network-delay-time-1.js new file mode 100644 index 00000000..3669ed83 --- /dev/null +++ b/lab/exercises/10-mixed/network-delay-time-1.js @@ -0,0 +1,45 @@ +/** + * @param {number[][]} times + * @param {number} N + * @param {number} K + * @return {number} + */ +function networkDelayTime(times, N, K) { + const graph = new Map(); + for (let i = 1; i <= N; i++) graph.set(i, []); + times.forEach(([u, v, w]) => { + graph.get(u).push([v, w]); + }); + + + const distances = Array(N + 1).fill(Infinity); + distances[0] = 0; + distances[K] = 0; + + const visited = []; + + while (true) { + let node; + let dist = Infinity; + // From all the unseen nodes find the one with the min distance. + for (let i = 1; i <= N; i++) { + if (!visited[i] && distances[i] < dist) { + node = i; + dist = distances[i]; + } + } + + if (!node) break; // none found, so all node has been visited + + visited[node] = true; + + graph.get(node).forEach(([n, w]) => { + distances[n] = Math.min(distances[n], dist + w); + }); + } + + const max = Math.max(...distances); + return max === Infinity ? -1 : max; +} + +module.exports = networkDelayTime; diff --git a/lab/exercises/10-mixed/network-delay-time.js b/lab/exercises/10-mixed/network-delay-time.js new file mode 100644 index 00000000..3669ed83 --- /dev/null +++ b/lab/exercises/10-mixed/network-delay-time.js @@ -0,0 +1,45 @@ +/** + * @param {number[][]} times + * @param {number} N + * @param {number} K + * @return {number} + */ +function networkDelayTime(times, N, K) { + const graph = new Map(); + for (let i = 1; i <= N; i++) graph.set(i, []); + times.forEach(([u, v, w]) => { + graph.get(u).push([v, w]); + }); + + + const distances = Array(N + 1).fill(Infinity); + distances[0] = 0; + distances[K] = 0; + + const visited = []; + + while (true) { + let node; + let dist = Infinity; + // From all the unseen nodes find the one with the min distance. + for (let i = 1; i <= N; i++) { + if (!visited[i] && distances[i] < dist) { + node = i; + dist = distances[i]; + } + } + + if (!node) break; // none found, so all node has been visited + + visited[node] = true; + + graph.get(node).forEach(([n, w]) => { + distances[n] = Math.min(distances[n], dist + w); + }); + } + + const max = Math.max(...distances); + return max === Infinity ? -1 : max; +} + +module.exports = networkDelayTime; diff --git a/lab/exercises/10-mixed/network-delay-time.spec.js b/lab/exercises/10-mixed/network-delay-time.spec.js new file mode 100644 index 00000000..c1a77e91 --- /dev/null +++ b/lab/exercises/10-mixed/network-delay-time.spec.js @@ -0,0 +1,31 @@ +const fn = require('./network-delay-time'); + +describe('Network Delay Time', () => { + it('should work', () => { + const times = [[2, 1, 1], [2, 3, 1], [3, 4, 1]]; + const n = 4; + const k = 2; + expect(fn(times, n, k)).toEqual(2); + }); + + it('should work', () => { + const times = [[2, 1, 15], [2, 3, 85], [1, 3, 0], [1, 2, 91], [3, 2, 78], [3, 1, 36]]; + const n = 3; + const k = 2; + expect(fn(times, n, k)).toEqual(15); + }); + + it('should work with highly connected networks', () => { + const times = [[14, 1, 8], [11, 2, 25], [14, 15, 37], [3, 7, 70], [11, 7, 60], [13, 11, 87], [15, 10, 67], [13, 10, 58], [5, 4, 56], [9, 3, 26], [5, 11, 51], [11, 4, 92], [7, 6, 8], [7, 10, 95], [14, 9, 0], [4, 13, 1], [7, 9, 89], [3, 14, 24], [11, 15, 30], [13, 2, 91], [15, 8, 60], [1, 4, 96], [8, 2, 71], [6, 8, 38], [14, 13, 46], [2, 12, 48], [10, 11, 92], [8, 12, 28], [8, 7, 12], [9, 13, 82], [8, 6, 27], [3, 2, 65], [4, 10, 62], [11, 13, 55], [1, 2, 52], [8, 3, 98], [7, 12, 85], [6, 12, 97], [9, 4, 90], [2, 4, 23], [9, 11, 20], [1, 14, 61], [8, 9, 77], [6, 5, 80], [14, 11, 33], [9, 8, 54], [13, 1, 42], [13, 8, 13], [10, 14, 40], [9, 7, 18], [14, 3, 50], [14, 6, 83], [14, 8, 14], [2, 1, 86], [9, 5, 54], [11, 5, 29], [9, 12, 43], [9, 2, 74], [14, 4, 87], [12, 7, 98], [7, 14, 13], [4, 12, 33], [5, 2, 60], [15, 11, 33], [8, 4, 99], [9, 6, 98], [4, 6, 57], [6, 11, 5], [9, 15, 37], [1, 3, 30], [9, 10, 60], [13, 12, 73], [13, 14, 56], [1, 11, 13], [14, 2, 8], [4, 15, 60], [11, 3, 90], [2, 5, 86], [11, 1, 1], [13, 4, 2], [15, 7, 91], [15, 4, 51], [11, 6, 70], [2, 7, 51], [11, 9, 37], [4, 2, 92], [10, 4, 4], [7, 2, 30], [13, 9, 79], [8, 15, 41], [11, 8, 18], [15, 2, 4], [12, 14, 88], [12, 6, 9], [12, 9, 44], [1, 6, 87], [15, 14, 42], [4, 9, 41], [7, 15, 90], [4, 1, 84], [7, 11, 9], [3, 11, 75], [5, 9, 2], [2, 11, 96], [12, 5, 89], [6, 15, 25], [5, 13, 7], [15, 5, 32], [13, 5, 84], [7, 5, 9], [15, 3, 14], [12, 13, 4], [5, 3, 73], [6, 9, 85], [6, 10, 29], [1, 8, 24], [12, 3, 85], [4, 3, 60], [1, 13, 6], [1, 5, 58], [2, 3, 29], [14, 5, 67], [13, 15, 70], [5, 14, 94], [15, 1, 95], [3, 1, 17], [10, 2, 6], [11, 10, 44], [9, 14, 62], [4, 11, 32], [15, 13, 48], [2, 10, 77], [3, 13, 90], [5, 7, 68], [10, 6, 78], [3, 6, 95], [10, 12, 68], [13, 6, 73], [10, 1, 8], [10, 7, 18], [10, 5, 64], [5, 1, 55], [13, 7, 90], [1, 9, 67], [3, 12, 76], [14, 10, 22], [12, 8, 83], [4, 7, 76], [8, 13, 25], [5, 6, 57], [13, 3, 90], [6, 2, 96], [11, 14, 61], [12, 1, 94], [12, 15, 12], [4, 8, 88], [4, 14, 27], [7, 4, 25], [3, 9, 57], [2, 15, 90], [1, 12, 85], [12, 11, 44], [5, 10, 13], [5, 12, 96], [14, 7, 24], [14, 12, 98], [10, 9, 36], [15, 6, 17], [8, 10, 11], [2, 13, 5], [10, 3, 78], [6, 13, 11], [5, 15, 34], [12, 10, 12], [9, 1, 68], [10, 13, 1], [7, 13, 86], [1, 7, 62], [2, 14, 53], [8, 14, 75], [2, 6, 49], [10, 15, 83], [7, 8, 88], [6, 1, 87], [8, 1, 38], [8, 11, 73], [3, 15, 1], [3, 8, 93], [2, 8, 26], [4, 5, 26], [3, 4, 58], [7, 1, 55], [7, 3, 84], [5, 8, 97], [12, 4, 42], [6, 3, 71], [6, 7, 48], [15, 12, 3], [1, 15, 30], [10, 8, 11], [2, 9, 49], [6, 14, 95], [3, 10, 68], [6, 4, 14], [11, 12, 29], [1, 10, 93], [8, 5, 55], [12, 2, 86], [3, 5, 26], [15, 9, 12]]; + const n = 15; + const k = 11; + expect(fn(times, n, k)).toEqual(38); + }); + + it('should work with highly connected networks', () => { + const times = [[15,8,1],[7,10,41],[7,9,34],[9,4,31],[12,13,50],[14,3,52],[4,11,99],[4,7,86],[10,13,57],[9,6,10],[1,7,51],[7,15,38],[1,9,11],[12,7,94],[9,13,34],[11,7,79],[7,6,28],[5,3,34],[2,6,97],[14,1,97],[6,10,90],[12,10,37],[13,3,73],[11,14,7],[15,1,39],[6,5,90],[13,6,43],[6,9,32],[4,6,45],[11,10,2],[2,13,4],[14,15,29],[1,14,88],[14,6,19],[6,2,29],[3,14,72],[1,15,4],[11,5,2],[6,7,56],[8,7,88],[13,14,70],[14,12,58],[14,2,86],[11,3,57],[5,2,56],[3,10,26],[2,11,21],[14,5,54],[5,12,40],[14,4,81],[15,2,99],[5,7,57],[13,12,5],[4,9,60],[12,15,48],[6,14,1],[9,7,44],[13,7,69],[5,13,42],[4,1,7],[11,9,76],[8,1,76],[5,14,29],[2,3,69],[7,3,23],[12,14,28],[11,4,85],[10,1,10],[15,12,36],[1,11,69],[15,10,96],[11,13,69],[7,12,49],[1,2,95],[6,4,46],[8,12,94],[12,4,93],[13,5,31],[12,2,60],[6,1,87],[4,14,20],[5,11,89],[4,15,88],[4,10,21],[1,6,5],[10,8,26],[8,2,51],[3,15,23],[7,2,12],[11,1,47],[2,1,75],[3,8,63],[8,10,19],[6,8,18],[4,2,55],[14,11,80],[10,3,73],[3,5,22],[12,3,61],[1,13,33],[9,3,98],[9,12,69],[15,9,6],[7,13,76],[11,12,22],[11,15,51],[13,15,46],[5,10,58],[1,10,26],[13,4,85],[7,14,58],[5,8,46],[11,6,32],[10,9,41],[9,14,35],[14,13,60],[3,9,97],[2,5,39],[7,11,19],[1,12,27],[7,5,13],[8,4,34],[9,15,25],[5,1,93],[15,13,97],[14,9,35],[8,6,67],[9,5,39],[13,11,35],[7,4,21],[12,9,64],[14,8,8],[10,12,94],[8,9,76],[8,5,71],[2,9,64],[10,14,59],[1,4,74],[7,1,69],[15,5,55],[6,15,80],[13,8,84],[8,13,63],[8,3,91],[10,4,87],[1,5,39],[8,11,0],[1,3,79],[4,5,82],[4,12,87],[3,11,29],[7,8,92],[10,7,77],[6,12,42],[13,2,40],[9,10,13],[4,13,65],[2,4,34],[3,13,44],[2,14,69],[3,4,42],[5,15,98],[14,7,6],[15,3,94],[10,2,37],[15,11,7],[9,2,15],[13,9,66],[4,8,83],[8,15,23],[13,1,50],[6,13,57],[2,10,37],[10,6,38],[2,7,45],[9,8,8],[3,12,28],[3,2,83],[2,12,75],[1,8,91],[4,3,70],[12,6,48],[3,1,13],[5,6,42],[6,11,96],[3,6,22],[15,6,34],[11,8,43],[15,7,40],[9,11,57],[11,2,11],[2,8,22],[9,1,73],[2,15,40],[12,11,10],[15,4,78],[12,8,75],[10,15,37],[13,10,44],[8,14,33],[3,7,82],[5,4,46],[12,5,79],[15,14,43],[10,5,65],[5,9,34],[12,1,54],[6,3,16],[14,10,83],[10,11,67]]; + const n = 15; + const k = 8; + expect(fn(times, n, k)).toEqual(34); + }); +}); diff --git a/lab/exercises/10-mixed/reorder-log-files.js b/lab/exercises/10-mixed/reorder-log-files.js new file mode 100644 index 00000000..88e3f9e6 --- /dev/null +++ b/lab/exercises/10-mixed/reorder-log-files.js @@ -0,0 +1,24 @@ +function reorderLogFiles(logs) { + logs.sort((log1, log2) => { + const [id1, ...words1] = log1.split(' '); + const [id2, ...words2] = log2.split(' '); + const isNumber1 = !Number.isNaN(Number(words1[0])); + const isNumber2 = !Number.isNaN(Number(words2[0])); + + // both letters + if (!isNumber1 && !isNumber2) { + const a = words1.join(' '); + const b = words2.join(' '); + if (a === b) return id1.localeCompare(id2); + return a.localeCompare(b); + } + // if one is number or both + if (isNumber1 && isNumber2) return 0; + if (isNumber1) return 1; + return -1; + }); + + return logs; +} + +module.exports = reorderLogFiles; diff --git a/lab/exercises/10-mixed/reorder-log-files.spec.js b/lab/exercises/10-mixed/reorder-log-files.spec.js new file mode 100644 index 00000000..43c1f212 --- /dev/null +++ b/lab/exercises/10-mixed/reorder-log-files.spec.js @@ -0,0 +1,15 @@ +const fn = require('./reorder-log-files'); + +describe('Reorder Log Files', () => { + it('should work', () => { + const actual = ['6p tzwmh ige mc', 'ns 566543603829', 'ubd cujg j d yf', 'ha6 1 938 376 5', '3yx 97 666 56 5', 'd 84 34353 2249', '0 tllgmf qp znc', 's 1088746413789', 'ys0 splqqxoflgx', 'uhb rfrwt qzx r', 'u lrvmdt ykmox', 'ah4 4209164350', 'rap 7729 8 125', '4 nivgc qo z i', 'apx 814023338 8']; + const expected = ['ubd cujg j d yf', 'u lrvmdt ykmox', '4 nivgc qo z i', 'uhb rfrwt qzx r', 'ys0 splqqxoflgx', '0 tllgmf qp znc', '6p tzwmh ige mc', 'ns 566543603829', 'ha6 1 938 376 5', '3yx 97 666 56 5', 'd 84 34353 2249', 's 1088746413789', 'ah4 4209164350', 'rap 7729 8 125', 'apx 814023338 8']; + expect(fn(actual)).toEqual(expected); + }); + + it('should work', () => { + const actual = ['dig1 8 1 5 1', 'let1 art can', 'dig2 3 6', 'let2 own kit dig', 'let3 art zero']; + const expected = ['let1 art can', 'let3 art zero', 'let2 own kit dig', 'dig1 8 1 5 1', 'dig2 3 6']; + expect(fn(actual)).toEqual(expected); + }); +}); diff --git a/lab/exercises/10-mixed/rotated-binary-search-1.js b/lab/exercises/10-mixed/rotated-binary-search-1.js new file mode 100644 index 00000000..41f3bad4 --- /dev/null +++ b/lab/exercises/10-mixed/rotated-binary-search-1.js @@ -0,0 +1,24 @@ +/** + * Recursive binary search + * @param {*} array + * @param {*} target + * @param {*} l + * @param {*} r + */ +function search(array, target, l = 0, r = array.length - 1) { + if (!array.length) return -1; + + const m = l + Math.floor((r - l) / 2); + + if (array[m] === target) { return m; } + if (r === l || m < 0) { return -1; } + + if (target > array[m]) { + // go right + return search(array, target, m + 1, r); + } + // go left + return search(array, target, l, m - 1); +} + +module.exports = search; diff --git a/lab/exercises/10-mixed/rotated-binary-search.js b/lab/exercises/10-mixed/rotated-binary-search.js new file mode 100644 index 00000000..8ea4d8a2 --- /dev/null +++ b/lab/exercises/10-mixed/rotated-binary-search.js @@ -0,0 +1,23 @@ +function search(array, target, lo = 0, hi = array.length - 1) { + if (!array.length) return -1; + if (lo > hi) { return -1; } + + const m = lo + Math.floor((hi - lo) / 2); + const M = array[m]; + const L = array[lo]; + const R = array[hi]; + + if (M === target) { return m; } + if ( + (R > L && target > M) // sorted array with no rotation + || (R > M && (target > M && target <= R)) // sorted array with pivot on M or left + || (M > R && (target > M || target < L)) // sorted array with pivot to right of M + ) { + // go right + return search(array, target, m + 1, hi); + } + // go left + return search(array, target, lo, m - 1); +} + +module.exports = search; diff --git a/lab/exercises/10-mixed/rotated-binary-search.spec.js b/lab/exercises/10-mixed/rotated-binary-search.spec.js new file mode 100644 index 00000000..2687354d --- /dev/null +++ b/lab/exercises/10-mixed/rotated-binary-search.spec.js @@ -0,0 +1,72 @@ +const fn = require('./rotated-binary-search'); + +describe('Search in Rotated Sorted Array', () => { + it('should work with empty', () => { + const array = []; + const target = 0; + const expected = -1; + expect(fn(array, target)).toEqual(expected); + }); + + it('should work with base case', () => { + const array = [0]; + const target = 0; + const expected = 0; + expect(fn(array, target)).toEqual(expected); + }); + + it('should work with base case if not found', () => { + const array = [0]; + const target = 1; + const expected = -1; + expect(fn(array, target)).toEqual(expected); + }); + + it('should work with 2 elements', () => { + const array = [0, 1]; + expect(fn(array, 0)).toEqual(0); + expect(fn(array, 1)).toEqual(1); + expect(fn(array, 2)).toEqual(-1); + expect(fn(array, -1)).toEqual(-1); + }); + + it('should work with 2 elements "rotated"', () => { + const array = [1, 0]; + expect(fn(array, 0)).toEqual(1); + expect(fn(array, 1)).toEqual(0); + expect(fn(array, 2)).toEqual(-1); + expect(fn(array, -1)).toEqual(-1); + }); + + it('should work with 3 elements', () => { + const array = [0, 1, 2]; + expect(fn(array, 0)).toEqual(0); + expect(fn(array, 1)).toEqual(1); + expect(fn(array, 2)).toEqual(2); + expect(fn(array, 3)).toEqual(-1); + expect(fn(array, -1)).toEqual(-1); + }); + + it('should work with 3 elements "rotated"', () => { + const array = [2, 0, 1]; + expect(fn(array, 0)).toEqual(1); + expect(fn(array, 1)).toEqual(2); + expect(fn(array, 2)).toEqual(0); + expect(fn(array, 3)).toEqual(-1); + expect(fn(array, -1)).toEqual(-1); + }); + + it('should work', () => { + const array = [4, 5, 6, 7, 0, 1, 2]; + const target = 5; + const expected = 1; + expect(fn(array, target)).toEqual(expected); + }); + + it('should work', () => { + const array = [9, 0, 2, 7, 8]; + const target = 3; + const expected = -1; + expect(fn(array, target)).toEqual(expected); + }); +}); diff --git a/lab/exercises/10-mixed/trapping-rain-water-1.js b/lab/exercises/10-mixed/trapping-rain-water-1.js new file mode 100644 index 00000000..d79e90a2 --- /dev/null +++ b/lab/exercises/10-mixed/trapping-rain-water-1.js @@ -0,0 +1,28 @@ +/** + * Compute how much water it is able to trap after raining. + * @param {number[]} height Non-negative integers representing + * an elevation map where the width of each bar is 1. + * + * @runtime O(n^2) - Brute force + * @space O(1) + */ +function trap(height) { + let ans = 0; + + for (let i = 0; i < height.length; i++) { + let leftMax = 0; + let rightMax = 0; + for (let j = i; j >= 0; j--) { + leftMax = Math.max(leftMax, height[j]); + } + for (let j = i; j < height.length; j++) { + rightMax = Math.max(rightMax, height[j]); + } + + ans += Math.min(leftMax, rightMax) - height[i]; + } + + return ans; +} + +module.exports = trap; diff --git a/lab/exercises/10-mixed/trapping-rain-water.js b/lab/exercises/10-mixed/trapping-rain-water.js new file mode 100644 index 00000000..510e8b3a --- /dev/null +++ b/lab/exercises/10-mixed/trapping-rain-water.js @@ -0,0 +1,28 @@ +/** + * Compute how much water it is able to trap after raining. + * @param {number[]} height Non-negative integers representing + * an elevation map where the width of each bar is 1. + * + * @runtime O(n) - using DP + * @space O(n) + */ +function trap(height) { + let ans = 0; + const leftMax = []; + const rightMax = []; + + for (let j = height.length - 1; j >= 0; j--) { + leftMax[j] = Math.max((leftMax[j + 1] || 0), height[j]); + } + for (let j = 0; j < height.length; j++) { + rightMax[j] = Math.max((rightMax[j - 1] || 0), height[j]); + } + + for (let i = 0; i < height.length; i++) { + ans += Math.min(leftMax[i], rightMax[i]) - height[i]; + } + + return ans; +} + +module.exports = trap; diff --git a/lab/exercises/10-mixed/trapping-rain-water.spec.js b/lab/exercises/10-mixed/trapping-rain-water.spec.js new file mode 100644 index 00000000..eeba5ab3 --- /dev/null +++ b/lab/exercises/10-mixed/trapping-rain-water.spec.js @@ -0,0 +1,19 @@ +const trap = require('./trapping-rain-water'); + +describe('Trapping Rain Water', () => { + it('should trap', () => { + expect(trap([1, 0, 1])).toEqual(1); + }); + + it('should not trap', () => { + expect(trap([1, 1, 1])).toEqual(0); + }); + + it('should not trap', () => { + expect(trap([0, 0, 0])).toEqual(0); + }); + + it('should trap', () => { + expect(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])).toEqual(6); + }); +}); diff --git a/package-lock.json b/package-lock.json index bb64e661..dd37f702 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,239 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.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.0", + "lodash": "^4.17.13" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", @@ -32,6 +265,30 @@ } } }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/runtime": { "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", @@ -49,6 +306,124 @@ } } }, + "@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==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + }, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "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=", + "dev": true + } + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "@commitlint/execute-rule": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz", @@ -103,351 +478,247 @@ } } }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", - "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.0" - } - }, - "@octokit/core": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.4.3.tgz", - "integrity": "sha512-9T91nYeBB7+PNK3oxOuA+6DXCPRvhJ80ke+NqhXirBjVtNepTKFJXoWPqguRSBQ+dkEVA8dZJMxfFzjz9yhiuA==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.3.1", - "@octokit/types": "^2.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.0.tgz", - "integrity": "sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==", + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", "dev": true, "requires": { - "@octokit/types": "^2.0.0", - "is-plain-object": "^3.0.0", - "universal-user-agent": "^5.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "isobject": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - } - } - }, - "@octokit/graphql": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", - "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", - "dev": true, - "requires": { - "@octokit/request": "^5.3.0", - "@octokit/types": "^2.0.0", - "universal-user-agent": "^4.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "os-name": "^3.1.0" + "p-locate": "^4.1.0" } - } - } - }, - "@octokit/plugin-paginate-rest": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz", - "integrity": "sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", - "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.4.0.tgz", - "integrity": "sha512-Tvctk0u5SVrSLAzi8SLo0KrLSBl5biAHBgWy3L65vsbO/2fjzr62HVkoDPyr+WRT+eHhhqpKAERF3dQWOIUOvQ==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.4.tgz", - "integrity": "sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.0", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "is-plain-object": "^3.0.0", - "node-fetch": "^2.3.0", - "once": "^1.4.0", - "universal-user-agent": "^5.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { - "isobject": "^4.0.0" + "p-try": "^2.0.0" } }, - "isobject": { + "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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "@octokit/request-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", - "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.1.4.tgz", - "integrity": "sha512-LGghhepxoXyvi7ew0OdedrlwXQog8gvTbcdXoQ6RDKnzoYW2rBpcqeWC4fTuPUp9K0UEykcMix8kFnQ5b+64JQ==", - "dev": true, - "requires": { - "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.0.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.4.0" - } - }, - "@octokit/types": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.1.tgz", - "integrity": "sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true }, - "@semantic-release/changelog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-5.0.1.tgz", - "integrity": "sha512-unvqHo5jk4dvAf2nZ3aw4imrlwQ2I50eVVvq9D47Qc3R+keNqepx1vDYwkjF8guFXnOYaYcR28yrZWno1hFbiw==", + "@jest/console": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", + "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", "dev": true, "requires": { - "@semantic-release/error": "^2.1.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^9.0.0", - "lodash": "^4.17.4" + "@jest/source-map": "^25.2.6", + "chalk": "^3.0.0", + "jest-util": "^25.2.6", + "slash": "^3.0.0" }, "dependencies": { - "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "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==", "dev": true, "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "@semantic-release/commit-analyzer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", - "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.7", - "debug": "^4.0.0", - "import-from": "^3.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-name": "~1.1.4" } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "has-flag": "^4.0.0" } } } }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "@semantic-release/git": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-9.0.0.tgz", - "integrity": "sha512-AZ4Zha5NAPAciIJH3ipzw/WU9qLAn8ENaoVAhD6srRPxTpTzuV3NhNh14rcAo8Paj9dO+5u4rTKcpetOBluYVw==", + "@jest/core": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", + "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", "dev": true, "requires": { - "@semantic-release/error": "^2.1.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" + "@jest/console": "^25.2.6", + "@jest/reporters": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.2.6", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-resolve-dependencies": "^25.2.7", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "jest-watcher": "^25.2.7", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "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==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "type-fest": "^0.11.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", "dev": true, "requires": { - "ms": "^2.1.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "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==", "dev": true, "requires": { - "pump": "^3.0.0" + "color-name": "~1.1.4" } }, - "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==", + "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==", "dev": true }, - "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==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "micromatch": { @@ -460,86 +731,150 @@ "picomatch": "^2.0.5" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "glob": "^7.1.3" } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "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==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "ansi-regex": "^5.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==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true } } }, - "@semantic-release/github": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", - "integrity": "sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A==", + "@jest/environment": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", + "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", "dev": true, "requires": { - "@octokit/rest": "^17.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^9.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^2.4.3", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6" + } + }, + "@jest/fake-timers": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", + "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "lolex": "^5.0.0" + } + }, + "@jest/reporters": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", + "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" }, "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -549,2524 +884,2641 @@ "ms": "^2.1.1" } }, - "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" } }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "@semantic-release/npm": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz", - "integrity": "sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "execa": "^4.0.0", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^5.0.0", - "npm": "^6.10.3", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^4.0.0", - "semver": "^7.1.2", - "tempy": "^0.5.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { + "istanbul-lib-source-maps": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", - "dev": true, - "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" - } - }, - "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { - "pump": "^3.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "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==", - "dev": true - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" } }, - "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==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.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==", - "dev": true - }, - "read-pkg": { + "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "ansi-regex": "^4.1.0" } }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - }, - "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==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "has-flag": "^4.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==", - "dev": true - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + } + } + }, + "@jest/source-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, - "@semantic-release/release-notes-generator": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz", - "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==", + "@jest/test-result": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", + "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^5.0.0", - "import-from": "^3.0.0", - "into-stream": "^5.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" + "@jest/console": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", + "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", + "dev": true, + "requires": { + "@jest/test-result": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7" + } + }, + "@jest/transform": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", + "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.2.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.2.6", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^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==", + "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==", "dev": true, "requires": { - "ms": "^2.1.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "pump": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "color-name": "~1.1.4" } }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "p-try": "^2.0.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.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==", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "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==", + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "has-flag": "^4.0.0" } }, - "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==", - "dev": true + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "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==", "dev": true, "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": { - "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==", - "dev": true - } + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, + "@jest/types": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", + "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/node": { - "version": "13.9.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", - "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "abab": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", - "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - } + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "@octokit/auth-token": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", + "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", "dev": true, "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } + "@octokit/types": "^2.0.0" } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", - "dev": true + "@octokit/core": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.4.3.tgz", + "integrity": "sha512-9T91nYeBB7+PNK3oxOuA+6DXCPRvhJ80ke+NqhXirBjVtNepTKFJXoWPqguRSBQ+dkEVA8dZJMxfFzjz9yhiuA==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.3.1", + "@octokit/types": "^2.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } }, - "agent-base": { + "@octokit/endpoint": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.0.tgz", + "integrity": "sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==", "dev": true, "requires": { - "debug": "4" + "@octokit/types": "^2.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^5.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", "dev": true, "requires": { - "ms": "^2.1.1" + "isobject": "^4.0.0" } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true } } }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "@octokit/graphql": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", + "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@octokit/request": "^5.3.0", + "@octokit/types": "^2.0.0", + "universal-user-agent": "^4.0.0" }, "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "universal-user-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", + "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } } } }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "@octokit/plugin-paginate-rest": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz", + "integrity": "sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "@octokit/types": "^2.0.1" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "@octokit/plugin-request-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", + "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", "dev": true }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "@octokit/plugin-rest-endpoint-methods": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.4.0.tgz", + "integrity": "sha512-Tvctk0u5SVrSLAzi8SLo0KrLSBl5biAHBgWy3L65vsbO/2fjzr62HVkoDPyr+WRT+eHhhqpKAERF3dQWOIUOvQ==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1", + "deprecation": "^2.3.1" + } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "@octokit/request": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.4.tgz", + "integrity": "sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.0", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true + } + } }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "@octokit/request-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", + "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true + "@octokit/rest": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.1.4.tgz", + "integrity": "sha512-LGghhepxoXyvi7ew0OdedrlwXQog8gvTbcdXoQ6RDKnzoYW2rBpcqeWC4fTuPUp9K0UEykcMix8kFnQ5b+64JQ==", + "dev": true, + "requires": { + "@octokit/core": "^2.4.3", + "@octokit/plugin-paginate-rest": "^2.0.0", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "3.4.0" + } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@octokit/types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.1.tgz", + "integrity": "sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "@types/node": ">= 8" + } + }, + "@semantic-release/changelog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-5.0.1.tgz", + "integrity": "sha512-unvqHo5jk4dvAf2nZ3aw4imrlwQ2I50eVVvq9D47Qc3R+keNqepx1vDYwkjF8guFXnOYaYcR28yrZWno1hFbiw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.4" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "ms": "2.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^1.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=", - "dev": true, - "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + } + }, + "@semantic-release/commit-analyzer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", + "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.7", + "debug": "^4.0.0", + "import-from": "^3.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "ms": "^2.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" } - }, - "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==", + } + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/git": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-9.0.0.tgz", + "integrity": "sha512-AZ4Zha5NAPAciIJH3ipzw/WU9qLAn8ENaoVAhD6srRPxTpTzuV3NhNh14rcAo8Paj9dO+5u4rTKcpetOBluYVw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "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==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ms": "^2.1.1" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "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" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "pump": "^3.0.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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==", "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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==", "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "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" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "ms": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.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==", + "dev": true + }, + "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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==", "dev": true }, - "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=", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "isexe": "^2.0.0" } } } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "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==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asciidoctor.js": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", - "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", + "@semantic-release/github": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", + "integrity": "sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A==", "dev": true, "requires": { - "opal-runtime": "1.0.11" + "@octokit/rest": "^17.0.0", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "bottleneck": "^2.18.1", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^9.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^2.4.3", + "p-filter": "^2.0.0", + "p-retry": "^4.0.0", + "url-join": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "@semantic-release/npm": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz", + "integrity": "sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "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==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "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=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "execa": "^4.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^5.0.0", + "npm": "^6.10.3", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^4.0.0", + "semver": "^7.1.2", + "tempy": "^0.5.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "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" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "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" } - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dev": true, "requires": { - "ms": "2.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, - "ms": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "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==", "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", - "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.2.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-jest-hoist": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-preset-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", - "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^23.2.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "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==", "dev": true, "requires": { - "ms": "2.0.0" + "path-key": "^3.0.0" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "ms": { + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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==", + "dev": true + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "@semantic-release/release-notes-generator": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz", + "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^5.0.0", + "import-from": "^3.0.0", + "into-stream": "^5.0.0", "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "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" + "read-pkg-up": "^7.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "ms": "^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==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "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==", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "pump": "^3.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "p-locate": "^4.1.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "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": { + "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==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "type-detect": "4.0.8" } }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", "dev": true }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", "dev": true, "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@types/babel__traverse": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "@babel/types": "^7.3.0" } }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "@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==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "@types/istanbul-lib-coverage": "*" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", "dev": true, "requires": { - "node-int64": "^0.4.0" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "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==", + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } + "@types/node": { + "version": "13.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", + "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", + "dev": true }, - "cachedir": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", - "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "@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==", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "optional": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "optional": true - } - } + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } + "@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" + "@types/yargs-parser": "*" } }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/experimental-utils": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", + "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.26.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } } }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "@typescript-eslint/typescript-estree": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", + "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", "dev": true, "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" }, "dependencies": { - "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==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "ms": "^2.1.1" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "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" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "abab": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", + "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "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==", + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" }, "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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { - "colors": "1.0.3" + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true }, - "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==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "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==", - "dev": true, - "optional": true - }, - "commitizen": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", - "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", - "dev": true, - "requires": { - "cachedir": "2.2.0", - "cz-conventional-changelog": "3.0.1", - "dedent": "0.7.0", - "detect-indent": "6.0.0", - "find-node-modules": "2.0.0", - "find-root": "1.1.0", - "fs-extra": "8.1.0", - "glob": "7.1.4", - "inquirer": "6.5.0", - "is-utf8": "^0.2.1", - "lodash": "4.17.15", - "minimist": "1.2.0", - "shelljs": "0.7.6", - "strip-bom": "4.0.0", - "strip-json-comments": "3.0.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "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==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "conventional-commit-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", - "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "cz-conventional-changelog": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", - "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", - "dev": true, - "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "conventional-commit-types": "^2.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "right-pad": "^1.0.1", - "word-wrap": "^1.0.3" - } - }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "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" + "ms": "2.0.0" } }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "strip-json-comments": { + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" + "default-require-extensions": "^1.0.0" } }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "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==", - "dev": true + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "arr-flatten": "^1.0.1" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "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==", "dev": true }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "conventional-changelog": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz", - "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.6", - "conventional-changelog-atom": "^2.0.3", - "conventional-changelog-codemirror": "^2.0.3", - "conventional-changelog-conventionalcommits": "^4.2.3", - "conventional-changelog-core": "^4.1.4", - "conventional-changelog-ember": "^2.0.4", - "conventional-changelog-eslint": "^3.0.4", - "conventional-changelog-express": "^2.0.1", - "conventional-changelog-jquery": "^3.0.6", - "conventional-changelog-jshint": "^2.0.3", - "conventional-changelog-preset-loader": "^2.3.0" - } + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true }, - "conventional-changelog-angular": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", - "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", - "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-cli": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz", - "integrity": "sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA==", - "dev": true, - "requires": { - "add-stream": "^1.0.0", - "conventional-changelog": "^3.1.18", - "lodash": "^4.17.15", - "meow": "^5.0.0", - "tempfile": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } } }, - "conventional-changelog-codemirror": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", - "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", - "dev": true, - "requires": { - "q": "^1.5.1" - } + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, - "conventional-changelog-conventionalcommits": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", - "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "lodash": "^4.17.15", - "q": "^1.5.1" - } + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, - "conventional-changelog-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz", - "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==", + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.11", - "conventional-commits-parser": "^3.0.8", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^3.0.1", - "lodash": "^4.17.15", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" }, "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "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==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "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.1", + "string.prototype.trimright": "^2.1.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "has": "^1.0.3" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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==", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "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==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "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==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } } } }, - "conventional-changelog-ember": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", - "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, - "conventional-changelog-eslint": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", - "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", + "asciidoctor.js": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", + "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", "dev": true, "requires": { - "q": "^1.5.1" + "opal-runtime": "1.0.11" } }, - "conventional-changelog-express": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", - "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "q": "^1.5.1" + "safer-buffer": "~2.1.0" } }, - "conventional-changelog-jquery": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", - "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, - "conventional-changelog-jshint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", - "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" + "lodash": "^4.17.14" } }, - "conventional-changelog-preset-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", - "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", + "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==", "dev": true }, - "conventional-changelog-writer": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", - "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", - "dateformat": "^3.0.0", - "handlebars": "^4.4.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^5.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "conventional-commits-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", - "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", - "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^5.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" - } - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "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=", "dev": true }, - "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=", + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, - "optional": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "optional": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.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" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "ansi-regex": "^2.0.0" } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "optional": true } } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "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==", - "dev": true - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "cssom": "0.3.x" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "cz-conventional-changelog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", - "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", + "babel-jest": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", + "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", "dev": true, "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "right-pad": "^1.0.1", - "word-wrap": "^1.0.3" - } - }, - "cz-emoji": { - "version": "github:amejiarosario/cz-emoji#c7518f2b6ed3368dd60a37c1a4abbfff041549c0", - "from": "github:amejiarosario/cz-emoji", - "dev": true, - "requires": { - "cli-truncate": "^1.0.0", - "fuse.js": "^3.4.5", - "home-dir": "^1.0.0", - "inquirer-autocomplete-prompt": "^0.12.0", - "inquirer-maxlength-input-prompt": "^1.0.0", - "pad": "^2.3.0", - "prettier": "^1.18.2", - "read-pkg-up": "^2.0.0", - "wrap-ansi": "^3.0.0" + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.2.6", + "chalk": "^3.0.0", + "slash": "^3.0.0" }, "dependencies": { - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "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==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "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==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } } } }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "babel-runtime": "^6.22.0" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "babel-plugin-jest-hoist": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } + "@types/babel__traverse": "^7.0.6" } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "babel-preset-jest": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", + "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/plugin-syntax-bigint": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^25.2.6" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - } - } - }, - "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=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "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==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "source-map": "^0.5.6" } } } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "clone": "^1.0.2" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "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==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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", @@ -3110,937 +3562,2352 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "repeating": "^2.0.0" + "tweetnacl": "^0.14.3" } }, - "detect-newline": { + "before-after-hook": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { - "esutils": "^2.0.2" + "file-uri-to-path": "1.0.0" } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "fill-range": "^7.0.1" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node-int64": "^0.4.0" } }, - "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==", + "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==", "dev": true }, - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-ci": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", - "integrity": "sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw==", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "execa": "^4.0.0", - "java-properties": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", - "dev": true, - "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.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.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==", - "dev": true - }, - "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==", - "dev": true, - "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==", + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", - "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } + "cachedir": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", + "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "dev": true }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, + "optional": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "optional": true + } } }, - "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=", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "rsvp": "^3.3.3" } }, - "eslint-config-airbnb-base": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", - "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.5", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" } }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==", "dev": true, "requires": { - "ms": "2.0.0" + "color-convert": "^1.9.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "ms": "2.0.0" + "has-flag": "^3.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "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==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "is-descriptor": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, - "eslint-plugin-jest": { - "version": "21.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.17.0.tgz", - "integrity": "sha512-kB0gaMLy4RA1bAltYSnnoW33hzX0bUrALGaIqaLoB41Fif38/uAv6oNUFbrzp7aFrwegxKUgFcE/8Z0DZEa0SQ==", - "dev": true - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "restore-cursor": "^2.0.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dev": true, "requires": { - "estraverse": "^4.0.0" + "colors": "1.0.3" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "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" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "number-is-nan": "^1.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "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==", "dev": true, "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } + "color-name": "1.1.3" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "delayed-stream": "~1.0.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "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==", "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "optional": true }, - "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "commitizen": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", + "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", "dev": true, "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" + "cachedir": "2.2.0", + "cz-conventional-changelog": "3.0.1", + "dedent": "0.7.0", + "detect-indent": "6.0.0", + "find-node-modules": "2.0.0", + "find-root": "1.1.0", + "fs-extra": "8.1.0", + "glob": "7.1.4", + "inquirer": "6.5.0", + "is-utf8": "^0.2.1", + "lodash": "4.17.15", + "minimist": "1.2.0", + "shelljs": "0.7.6", + "strip-bom": "4.0.0", + "strip-json-comments": "3.0.1" }, "dependencies": { - "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==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "conventional-commit-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", + "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", + "dev": true + }, + "cz-conventional-changelog": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", + "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "conventional-commit-types": "^2.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, - "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==", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "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" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true } } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "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==", "dev": true }, - "fastq": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", - "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, - "requires": { - "bser": "^2.0.0" - } + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "conventional-changelog": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz", + "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "conventional-changelog-angular": "^5.0.6", + "conventional-changelog-atom": "^2.0.3", + "conventional-changelog-codemirror": "^2.0.3", + "conventional-changelog-conventionalcommits": "^4.2.3", + "conventional-changelog-core": "^4.1.4", + "conventional-changelog-ember": "^2.0.4", + "conventional-changelog-eslint": "^3.0.4", + "conventional-changelog-express": "^2.0.1", + "conventional-changelog-jquery": "^3.0.6", + "conventional-changelog-jshint": "^2.0.3", + "conventional-changelog-preset-loader": "^2.3.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "conventional-changelog-angular": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", + "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "compare-func": "^1.3.1", + "q": "^1.5.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==", + "conventional-changelog-atom": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", + "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "q": "^1.5.1" } }, - "find-node-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", - "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", + "conventional-changelog-cli": { + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz", + "integrity": "sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA==", "dev": true, "requires": { - "findup-sync": "^3.0.0", - "merge": "^1.2.1" + "add-stream": "^1.0.0", + "conventional-changelog": "^3.1.18", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "tempfile": "^3.0.0" } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "conventional-changelog-codemirror": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", + "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "q": "^1.5.1" } }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "conventional-changelog-conventionalcommits": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", + "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "compare-func": "^1.3.1", + "lodash": "^4.17.15", + "q": "^1.5.1" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "conventional-changelog-core": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz", + "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.11", + "conventional-commits-parser": "^3.0.8", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^3.0.1", + "lodash": "^4.17.15", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" }, "dependencies": { - "arr-diff": { + "load-json-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "ms": "2.0.0" + "pify": "^3.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=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "conventional-changelog-ember": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", + "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", + "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", + "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", + "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", + "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", + "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", + "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.2", + "dateformat": "^3.0.0", + "handlebars": "^4.4.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "conventional-commits-filter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", + "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", + "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^5.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + }, + "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=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "optional": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "optional": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "optional": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "optional": true + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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==", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cz-conventional-changelog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", + "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" + } + }, + "cz-emoji": { + "version": "github:amejiarosario/cz-emoji#c7518f2b6ed3368dd60a37c1a4abbfff041549c0", + "from": "github:amejiarosario/cz-emoji", + "dev": true, + "requires": { + "cli-truncate": "^1.0.0", + "fuse.js": "^3.4.5", + "home-dir": "^1.0.0", + "inquirer-autocomplete-prompt": "^0.12.0", + "inquirer-maxlength-input-prompt": "^1.0.0", + "pad": "^2.3.0", + "prettier": "^1.18.2", + "read-pkg-up": "^2.0.0", + "wrap-ansi": "^3.0.0" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "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==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "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=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-ci": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", + "integrity": "sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "java-properties": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=", + "dev": true + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "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==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "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==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "23.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", + "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", + "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6" + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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==", + "dev": true + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "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" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "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==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", + "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", + "dev": true, + "requires": { + "findup-sync": "^3.0.0", + "merge": "^1.2.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.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=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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=", + "dev": true, + "requires": { + "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", @@ -4111,122 +5978,1480 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "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==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" } - }, - "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==", - "dev": true } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "fuse.js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", + "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", + "dev": true + }, + "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==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "pify": "^3.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.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==", + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, - "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==", + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz", + "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==", + "dev": true, + "requires": { + "meow": "^5.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "dev": true, + "requires": { + "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-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, + "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==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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=", + "dev": true, + "requires": { + "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", @@ -4247,1474 +7472,1564 @@ } } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-buffer": "^1.1.5" } } } }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "home-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", + "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "for-in": "^1.0.1" + "parse-passwd": "^1.0.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", "dev": true }, - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "whatwg-encoding": "^1.0.1" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, - "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "agent-base": "6", + "debug": "4" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, "debug": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, - "optional": true, "requires": { "ms": "^2.1.1" } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.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==", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, - "has-unicode": { + "color-convert": { "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "color-name": "~1.1.4" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "minipass": { - "version": "2.3.5", - "bundled": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "p-locate": "^4.1.0" } }, - "minizlib": { - "version": "1.2.1", - "bundled": true, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "p-try": "^2.0.0" } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "minimist": "0.0.8" + "p-limit": "^2.2.0" } }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "needle": { - "version": "2.3.0", - "bundled": true, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, - "optional": true, "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, + "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==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "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==", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "find-up": "^4.0.0" } }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "has-flag": "^4.0.0" } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "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==", + "dev": true + } + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "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==", "dev": true, - "optional": true + "requires": { + "type-fest": "^0.11.0" + } }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", "dev": true, - "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, - "object-assign": { - "version": "4.1.1", - "bundled": true, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "optional": true + "requires": { + "restore-cursor": "^3.1.0" + } }, - "once": { - "version": "1.4.0", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "color-name": "~1.1.4" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "optional": true + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "escape-string-regexp": "^1.0.5" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "rc": { - "version": "1.2.8", - "bundled": true, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "mimic-fn": "^2.1.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "optional": true, "requires": { - "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" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, - "rimraf": { - "version": "2.6.3", - "bundled": true, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, - "optional": true, "requires": { - "glob": "^7.1.3" + "is-promise": "^2.1.0" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, + "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==", "dev": true, - "optional": true + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } }, - "semver": { - "version": "5.7.0", - "bundled": true, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "optional": true + "requires": { + "ansi-regex": "^5.0.0" + } }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "optional": true + "requires": { + "has-flag": "^4.0.0" + } }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "inquirer-autocomplete-prompt": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", + "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "figures": "^2.0.0", + "inquirer": "3.2.0", + "run-async": "^2.3.0" + }, + "dependencies": { + "inquirer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", + "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", "dev": true, - "optional": true + "requires": { + "ansi-escapes": "^2.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + } + } + } + } + }, + "inquirer-maxlength-input-prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", + "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "inquirer": "^5.1.0", + "jest": "^22.4.2", + "lodash.invoke": "^4.5.2", + "lodash.isfunction": "^3.0.9", + "lodash.partialright": "^4.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "color-convert": "^1.9.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true }, - "tar": { - "version": "4.4.8", - "bundled": true, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", "dev": true, - "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", "dev": true, - "optional": true + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + } + } }, - "yallist": { - "version": "3.0.3", - "bundled": true, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "requires": { + "throat": "^4.0.0" + } }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" } }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", "dev": true, "requires": { - "repeating": "^2.0.0" + "detect-newline": "^2.1.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "pretty-format": "^22.4.3" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "jest-regex-util": "^22.4.3" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", "dev": true, "requires": { - "through2": "~2.0.0" + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" } - } - } - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" } }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "merge-stream": "^1.0.1" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "symbol-observable": "1.0.1" } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "camelcase": "^4.1.0" } } } }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "into-stream": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", + "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "dependencies": { + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "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==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "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=", "dev": true, "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" + "kind-of": "^3.0.2" } }, - "git-semver-tags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz", - "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==", + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "meow": "^5.0.0", - "semver": "^6.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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==", "dev": true } } }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true, - "requires": { - "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" - } + "optional": true }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-primitive": "^2.0.0" } }, - "global-dirs": { + "is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "optional": true, - "requires": { - "ini": "^1.3.4" - } + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, - "global-modules": { + "is-extglob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "number-is-nan": "^1.0.0" } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "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=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "is-extglob": "^1.0.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "globby": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", - "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "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=", + "dev": true + }, + "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==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "isobject": "^3.0.1" }, "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "handlebars": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", - "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "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==", + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "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==", - "dev": true - } + "has": "^1.0.3" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "has-symbols": "^1.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "text-extensions": "^1.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } + "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==", + "dev": true }, - "has-values": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "isarray": "1.0.0" } }, - "home-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", - "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" } }, - "hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", "dev": true }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "ms": "^2.1.1" + "has-flag": "^1.0.0" } } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "handlebars": "^4.0.3" } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, - "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "jest": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", + "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", "dev": true, "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "@jest/core": "^25.2.7", + "import-local": "^3.0.2", + "jest-cli": "^25.2.7" }, "dependencies": { "ansi-styles": { @@ -5758,19 +9073,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5787,6 +9089,46 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "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==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "jest-cli": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", + "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", + "dev": true, + "requires": { + "@jest/core": "^25.2.7", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5820,30 +9162,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, "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==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5853,1554 +9177,1975 @@ "find-up": "^4.0.0" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "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==", - "dev": true - } - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "inquirer-autocomplete-prompt": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", - "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "figures": "^2.0.0", - "inquirer": "3.2.0", - "run-async": "^2.3.0" - }, - "dependencies": { - "inquirer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", - "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", - "dev": true, - "requires": { - "ansi-escapes": "^2.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - } + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "inquirer-maxlength-input-prompt": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", - "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", + "jest-changed-files": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", + "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", "dev": true, "requires": { - "chalk": "^2.3.1", - "inquirer": "^5.1.0", - "jest": "^22.4.2", - "lodash.invoke": "^4.5.2", - "lodash.isfunction": "^3.0.9", - "lodash.partialright": "^4.2.1" + "@jest/types": "^25.2.6", + "execa": "^3.2.0", + "throat": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "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==", + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "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", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "babel-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", - "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.4" + "pump": "^3.0.0" } }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "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==", "dev": true }, - "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "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==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^22.4.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" + "path-key": "^3.0.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "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==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "shebang-regex": "^3.0.0" } }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", + "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.2.7", + "@jest/types": "^25.2.6", + "babel-jest": "^25.2.6", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.2.6", + "jest-environment-node": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "micromatch": "^4.0.2", + "pretty-format": "^25.2.6", + "realpath-native": "^2.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "get-stream": { + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", "dev": true }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", - "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^22.4.4" - }, - "dependencies": { - "jest-cli": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", - "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.14", - "istanbul-lib-coverage": "^1.1.1", - "istanbul-lib-instrument": "^1.8.0", - "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.2.0", - "jest-config": "^22.4.4", - "jest-environment-jsdom": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^22.4.2", - "jest-message-util": "^22.4.0", - "jest-regex-util": "^22.1.0", - "jest-resolve-dependencies": "^22.1.0", - "jest-runner": "^22.4.4", - "jest-runtime": "^22.4.4", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "jest-worker": "^22.2.2", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^10.0.3" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "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==", "dev": true, "requires": { - "throat": "^4.0.0" + "color-name": "~1.1.4" } }, - "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" + "has-flag": "^4.0.0" } - }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + } + } + }, + "jest-docblock": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", + "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + }, + "dependencies": { + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + } + } + }, + "jest-each": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", + "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6" + }, + "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==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "detect-newline": "^2.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "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==", "dev": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", - "jsdom": "^11.5.1" + "color-name": "~1.1.4" } }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" + "has-flag": "^4.0.0" } + } + } + }, + "jest-environment-jsdom": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", + "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", + "dev": true, + "requires": { + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "jsdom": "^15.2.1" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true }, - "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^22.4.3", - "jest-serializer": "^22.4.3", - "jest-worker": "^22.4.3", - "micromatch": "^2.3.11", - "sane": "^2.0.0" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } } }, - "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", - "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" } - }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { - "pretty-format": "^22.4.3" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", + "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", + "dev": true, + "requires": { + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "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==", + "dev": true + } + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", + "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "dependencies": { + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" + "rsvp": "^4.8.4" } }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "jest-regex-util": "^22.4.3" + "ms": "2.0.0" } }, - "jest-runner": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", - "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "exit": "^0.1.2", - "jest-config": "^22.4.4", - "jest-docblock": "^22.4.0", - "jest-haste-map": "^22.4.2", - "jest-jasmine2": "^22.4.4", - "jest-leak-detector": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-runtime": "^22.4.4", - "jest-util": "^22.4.1", - "jest-worker": "^22.2.2", - "throat": "^4.0.0" + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } } }, - "jest-runtime": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", - "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^22.4.4", - "babel-plugin-istanbul": "^4.1.5", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^22.4.4", - "jest-haste-map": "^22.4.2", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^10.0.3" + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", - "dev": true + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "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==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" + "kind-of": "^6.0.0" } }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "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==", "dev": true, "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0" + "kind-of": "^6.0.0" } }, - "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-config": "^22.4.4", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^22.4.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "merge-stream": "^1.0.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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "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=", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "isexe": "^2.0.0" } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + } + } + }, + "jest-jasmine2": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", + "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.2.7", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6", + "throat": "^5.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==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "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==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "color-name": "~1.1.4" } }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "has-flag": "^4.0.0" } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true } } }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "into-stream": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", - "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", + "jest-leak-detector": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", + "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", "dev": true, "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" }, "dependencies": { - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true } } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "jest-matcher-utils": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", + "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "chalk": "^3.0.0", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" }, "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==", + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "optional": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "jest-message-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", + "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.2.6", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.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=", - "dev": true - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "jest-mock": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", + "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "@jest/types": "^25.2.6" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, - "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=", + "jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "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==", + "jest-resolve": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", + "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "@jest/types": "^25.2.6", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "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==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "jest-resolve-dependencies": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", + "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", "dev": true, "requires": { - "isarray": "1.0.0" + "@jest/types": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.2.7" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "jest-runner": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", + "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", "dev": true, "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.2.7", + "jest-docblock": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-leak-detector": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "source-map-support": "^0.5.6", + "throat": "^5.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + } } }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" + "jest-runtime": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", + "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", + "dev": true, + "requires": { + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "jest-serializer": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", "dev": true }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "jest-snapshot": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", + "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", "dev": true, "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" + "@babel/types": "^7.0.0", + "@jest/types": "^25.2.6", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.2.7", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.2.6", + "semver": "^6.3.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "jest-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", + "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "make-dir": "^3.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^4.0.0" } } } }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "jest-validate": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", + "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "@jest/types": "^25.2.6", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.2.6" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.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==", "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true - }, - "jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", - "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", - "dev": true, - "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.6.0" - }, - "dependencies": { - "jest-cli": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", - "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.4.2", - "jest-config": "^23.6.0", - "jest-environment-jsdom": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve-dependencies": "^23.6.0", - "jest-runner": "^23.6.0", - "jest-runtime": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "jest-watcher": "^23.4.0", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "prompts": "^0.1.9", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "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==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "jest-changed-files": { - "version": "23.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", - "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", - "dev": true, - "requires": { - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", - "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.6.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^23.4.0", - "jest-environment-node": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.6.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "pretty-format": "^23.6.0" - } - }, - "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-docblock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", - "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", - "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "pretty-format": "^23.6.0" - } - }, - "jest-environment-jsdom": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", - "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", - "dev": true, - "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", - "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", - "dev": true, - "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-haste-map": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", - "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", - "dev": true, - "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "invariant": "^2.2.4", - "jest-docblock": "^23.2.0", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0" - } - }, - "jest-jasmine2": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", - "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", - "dev": true, - "requires": { - "babel-traverse": "^6.0.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^23.6.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.6.0", - "jest-each": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "pretty-format": "^23.6.0" - } - }, - "jest-leak-detector": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", - "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", - "dev": true, - "requires": { - "pretty-format": "^23.6.0" - } - }, - "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-message-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", - "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", - "dev": true - }, - "jest-regex-util": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", - "dev": true - }, - "jest-resolve": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", - "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "realpath-native": "^1.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", - "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", - "dev": true, - "requires": { - "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.6.0" - } - }, - "jest-runner": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", - "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "jest-watcher": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", + "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", "dev": true, "requires": { - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.6.0", - "jest-jasmine2": "^23.6.0", - "jest-leak-detector": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-runtime": "^23.6.0", - "jest-util": "^23.4.0", - "jest-worker": "^23.2.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.2.6", + "string-length": "^3.1.0" }, "dependencies": { - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.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==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true } } }, - "jest-runtime": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", - "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" - } - }, - "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", - "dev": true - }, - "jest-snapshot": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", - "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", - "dev": true, - "requires": { - "babel-types": "^6.0.0", - "chalk": "^2.0.1", - "jest-diff": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-resolve": "^23.6.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^23.6.0", - "semver": "^5.5.0" - } - }, - "jest-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", - "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", "dev": true, "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.4.0", - "mkdirp": "^0.5.1", - "slash": "^1.0.0", - "source-map": "^0.6.0" + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "callsites": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.6.0" - } - }, - "jest-watcher": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", - "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", - "dev": true, - "requires": { - "merge-stream": "^1.0.1" - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -7476,9 +11221,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "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==", "dev": true }, "json-stable-stringify": { @@ -7551,18 +11296,18 @@ } }, "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -7594,15 +11339,27 @@ "dev": true }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } } }, "locate-path": { @@ -7718,6 +11475,15 @@ "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", "dev": true }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "longest": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", @@ -7759,6 +11525,23 @@ "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", "dev": true }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -7892,20 +11675,19 @@ "dev": true }, "mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.0.1.tgz", + "integrity": "sha512-uIRYASflIsXqvKe+7aXbLrydaRzz4qiK6amqZDQI++eRtW3UoKtnDcGeCAOREgll7YMxO5E4VB9+3B0LFmy96g==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" + "mimic-fn": "^3.0.0" }, "dependencies": { "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", + "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==", "dev": true } } @@ -8242,6 +12024,12 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", @@ -11839,9 +15627,9 @@ "dev": true }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { @@ -11879,9 +15667,9 @@ } }, "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "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==", "dev": true }, "object-keys": { @@ -11920,25 +15708,106 @@ } }, "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } } }, "object.omit": { @@ -11968,18 +15837,99 @@ } } }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12029,24 +15979,6 @@ "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", "dev": true }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -12068,32 +16000,45 @@ "dev": true }, "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" }, "dependencies": { - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } } } }, @@ -12140,12 +16085,6 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -12275,12 +16214,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "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=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -12294,12 +16227,14 @@ "dev": true }, "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "pify": "^2.0.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "performance-now": { @@ -12335,6 +16270,15 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", @@ -12399,12 +16343,6 @@ "semver-compare": "^1.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -12436,29 +16374,47 @@ "dev": true }, "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true } } }, @@ -12481,13 +16437,13 @@ "dev": true }, "prompts": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", - "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { - "kleur": "^2.0.1", - "sisteransi": "^0.1.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" } }, "pseudomap": { @@ -12554,9 +16510,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -12581,15 +16537,21 @@ } } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -12600,6 +16562,40 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + } } }, "readable-stream": { @@ -12680,9 +16676,9 @@ } }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "registry-auth-token": { @@ -12799,16 +16795,6 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", @@ -12845,12 +16831,6 @@ "global-modules": "^1.0.0" } }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, "resolve-global": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", @@ -13250,9 +17230,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "micromatch": { @@ -13277,9 +17257,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "ms": { @@ -13306,6 +17286,15 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, "semantic-release": { "version": "17.0.4", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.4.tgz", @@ -13874,9 +17863,9 @@ } }, "sisteransi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", - "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { @@ -14043,20 +18032,13 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -14218,34 +18200,218 @@ "strip-ansi": "^4.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "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==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } } }, "string_decoder": { @@ -14350,17 +18516,69 @@ "dev": true }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "temp-dir": { @@ -14405,6 +18623,33 @@ } } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "test-exclude": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", @@ -14428,19 +18673,6 @@ "pinkie-promise": "^2.0.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -14450,28 +18682,6 @@ "pinkie-promise": "^2.0.0" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", @@ -14481,15 +18691,6 @@ "find-up": "^1.0.0", "read-pkg": "^1.0.0" } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } } } }, @@ -14506,12 +18707,12 @@ "dev": true }, "textlint-plugin-asciidoctor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textlint-plugin-asciidoctor/-/textlint-plugin-asciidoctor-1.0.2.tgz", - "integrity": "sha512-J2PKkk2Kct5Ebug4hpXaA4OiFI+I6MWGaEb3yMwZ6CDtY3xcBKtMZhR1WX0+I5xgfrGgKiUGlde3FR0oS/32FQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/textlint-plugin-asciidoctor/-/textlint-plugin-asciidoctor-1.0.3.tgz", + "integrity": "sha512-T9ZLVLTRMNaAVO5MV9+6IS9q4gYtZTOlaCeCl+VNP55pseTYMmkQwsKd+XnPdu3WLqTSZcqLizG5H5bHysg0dw==", "dev": true, "requires": { - "asciidoctor.js": "^1.5.6-preview.4" + "asciidoctor.js": "^1.5.9" } }, "throat": { @@ -14635,6 +18836,15 @@ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14659,22 +18869,31 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "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==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "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==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } }, "uglify-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.5.tgz", - "integrity": "sha512-7L3W+Npia1OCr5Blp4/Vw83tK1mu5gnoIURtT1fUVfQ3Kf8WStWV6NJz0fdoBJZls0KlweruRTLVe6XLafmy5g==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", "dev": true, "optional": true, "requires": { @@ -14773,46 +18992,154 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, - "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==", + "v8-to-istanbul": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", + "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, "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", @@ -14843,6 +19170,17 @@ "browser-process-hrtime": "^0.1.2" } }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -14863,9 +19201,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -14954,44 +19292,13 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" } }, "wrappy": { @@ -15001,9 +19308,9 @@ "dev": true }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" @@ -15035,6 +19342,12 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", @@ -15069,32 +19382,188 @@ } }, "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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==", + "dev": true, + "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==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "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==", + "dev": true + } } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { - "camelcase": "^4.1.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==", + "dev": true + } } } } diff --git a/package.json b/package.json index 53df590f..e1bf8e25 100644 --- a/package.json +++ b/package.json @@ -39,21 +39,21 @@ "commitizen": "^4.0.3", "conventional-changelog-cli": "^2.0.31", "cz-conventional-changelog": "^3.1.0", - "cz-emoji": "amejiarosario/cz-emoji", - "eslint": "4.19.1", - "eslint-config-airbnb-base": "^13.1.0", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-jest": "21.17.0", - "handlebars": ">=4.0.14", + "cz-emoji": "github:amejiarosario/cz-emoji", + "eslint": "6.8.0", + "eslint-config-airbnb-base": "14.1.0", + "eslint-plugin-import": "2.20.2", + "eslint-plugin-jest": "23.8.2", + "handlebars": "4.7.6", "husky": "^4.2.3", - "jest": "23.6.0", + "jest": "25.2.7", "js-yaml": ">=3.13.1", - "mem": ">=4.0.0", + "mem": "6.0.1", "semantic-release": "^17.0.4", - "textlint-plugin-asciidoctor": "1.0.2" + "textlint-plugin-asciidoctor": "1.0.3" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.5.0" }, "config": { "commitizen": { diff --git a/src/data-structures/graphs/graph.js b/src/data-structures/graphs/graph.js index 04095aa5..dd1072cd 100644 --- a/src/data-structures/graphs/graph.js +++ b/src/data-structures/graphs/graph.js @@ -47,7 +47,7 @@ class Graph { removeVertex(value) { const current = this.nodes.get(value); // <1> if (current) { - Array.from(this.nodes.values()).forEach(node => node.removeAdjacent(current)); // <2> + Array.from(this.nodes.values()).forEach((node) => node.removeAdjacent(current)); // <2> } return this.nodes.delete(value); // <3> } @@ -156,7 +156,7 @@ class Graph { if (node && !visited.has(node)) { yield node; visited.set(node); - node.getAdjacents().forEach(adj => visitList.add(adj)); + node.getAdjacents().forEach((adj) => visitList.add(adj)); } } } @@ -243,7 +243,7 @@ class Graph { sourceNode.getAdjacents().forEach((node) => { if (!newPath.has(node)) { const nextPaths = this.findAllPaths(node.value, destination, newPath); - nextPaths.forEach(nextPath => paths.push(nextPath)); + nextPaths.forEach((nextPath) => paths.push(nextPath)); } }); return paths; diff --git a/src/data-structures/graphs/graph.spec.js b/src/data-structures/graphs/graph.spec.js index 8f1d4e60..a4fbba7e 100644 --- a/src/data-structures/graphs/graph.spec.js +++ b/src/data-structures/graphs/graph.spec.js @@ -2,7 +2,7 @@ const { Graph } = require('../../index'); describe('Graph', () => { let graph; - const getValues = node => (Array.isArray(node) ? node.map(a => getValues(a)) : node.value); + const getValues = (node) => (Array.isArray(node) ? node.map((a) => getValues(a)) : node.value); beforeEach(() => { graph = new Graph(); diff --git a/src/data-structures/graphs/node.spec.js b/src/data-structures/graphs/node.spec.js index 16d07d13..97e76b02 100644 --- a/src/data-structures/graphs/node.spec.js +++ b/src/data-structures/graphs/node.spec.js @@ -10,7 +10,7 @@ describe('Node (Graph)', () => { describe('#addAdjacent', () => { it('should add node to adjacent list', () => { node.addAdjacent(new Node(2)); - expect(node.getAdjacents().map(n => n.value)).toEqual([2]); + expect(node.getAdjacents().map((n) => n.value)).toEqual([2]); }); }); @@ -32,26 +32,26 @@ describe('Node (Graph)', () => { it('should remove node to adjacent list', () => { expect(a.removeAdjacent(c)).toBe(true); - expect(node.getAdjacents().map(n => n.value)).toEqual(['b']); + expect(node.getAdjacents().map((n) => n.value)).toEqual(['b']); expect(a.removeAdjacent(b)).toBe(true); - expect(node.getAdjacents().map(n => n.value)).toEqual([]); + expect(node.getAdjacents().map((n) => n.value)).toEqual([]); }); it('should return undefined if not found', () => { expect(a.removeAdjacent(d)).toBe(false); - expect(node.getAdjacents().map(n => n.value)).toEqual(['b', 'c']); + expect(node.getAdjacents().map((n) => n.value)).toEqual(['b', 'c']); }); }); describe('#getAdjacents', () => { it('should get adjacents', () => { node.addAdjacent(new Node('b')); - expect(node.getAdjacents().map(n => n.value)).toEqual(['b']); + expect(node.getAdjacents().map((n) => n.value)).toEqual(['b']); }); it('should get adjacents when empty', () => { - expect(node.getAdjacents().map(n => n.value)).toEqual([]); + expect(node.getAdjacents().map((n) => n.value)).toEqual([]); }); }); diff --git a/src/data-structures/linked-lists/linked-list.js b/src/data-structures/linked-lists/linked-list.js index 5da9e56f..b33a7707 100644 --- a/src/data-structures/linked-lists/linked-list.js +++ b/src/data-structures/linked-lists/linked-list.js @@ -298,7 +298,7 @@ class LinkedList { toString() { const parts = [...this]; // see [Symbol.iterator]() - return parts.map(n => util.inspect(n.node.value)).join(' -> '); + return parts.map((n) => util.inspect(n.node.value)).join(' -> '); } } diff --git a/src/data-structures/sets/array-set.js b/src/data-structures/sets/array-set.js index 4505c891..180c5223 100644 --- a/src/data-structures/sets/array-set.js +++ b/src/data-structures/sets/array-set.js @@ -9,7 +9,7 @@ class ArraySet { */ constructor(iterable = []) { this.array = []; - Array.from(iterable).forEach(element => this.add(element)); + Array.from(iterable).forEach((element) => this.add(element)); } /** diff --git a/src/data-structures/sets/hash-set.js b/src/data-structures/sets/hash-set.js index 4f139204..0817a560 100644 --- a/src/data-structures/sets/hash-set.js +++ b/src/data-structures/sets/hash-set.js @@ -12,7 +12,7 @@ class HashMapSet { */ constructor(iterable = []) { this.hashMap = new HashMap(); - Array.from(iterable).forEach(element => this.add(element)); + Array.from(iterable).forEach((element) => this.add(element)); } /** diff --git a/src/data-structures/sets/map-set.js b/src/data-structures/sets/map-set.js index f261892d..fdb42391 100644 --- a/src/data-structures/sets/map-set.js +++ b/src/data-structures/sets/map-set.js @@ -9,7 +9,7 @@ class MapSet { */ constructor(iterable = []) { this.map = new Map(); - Array.from(iterable).forEach(element => this.add(element)); + Array.from(iterable).forEach((element) => this.add(element)); } /** diff --git a/src/data-structures/sets/tree-set.js b/src/data-structures/sets/tree-set.js index 3eecb3e2..1483e63f 100644 --- a/src/data-structures/sets/tree-set.js +++ b/src/data-structures/sets/tree-set.js @@ -16,7 +16,7 @@ class TreeSet { */ constructor(iterable = []) { this.tree = new Tree(); - Array.from(iterable).forEach(value => this.add(value)); // <1> + Array.from(iterable).forEach((value) => this.add(value)); // <1> } /** diff --git a/src/data-structures/trees/avl-tree.spec.js b/src/data-structures/trees/avl-tree.spec.js index af831cdc..c45ff94e 100644 --- a/src/data-structures/trees/avl-tree.spec.js +++ b/src/data-structures/trees/avl-tree.spec.js @@ -69,7 +69,7 @@ describe('AvlTree', () => { }); it('should not balance', () => { - [30, 20, 40, 10, 50].forEach(v => tree.add(v)); + [30, 20, 40, 10, 50].forEach((v) => tree.add(v)); expect(tree.toArray()).toEqual([ 30, diff --git a/src/data-structures/trees/binary-search-tree.spec.js b/src/data-structures/trees/binary-search-tree.spec.js index 9039597f..40b9601d 100644 --- a/src/data-structures/trees/binary-search-tree.spec.js +++ b/src/data-structures/trees/binary-search-tree.spec.js @@ -2,7 +2,7 @@ const { BinarySearchTree } = require('../../index'); describe('Binary Search Tree', () => { let bst; - const getValues = treeGenerator => Array.from(treeGenerator).map(node => node.value); + const getValues = (treeGenerator) => Array.from(treeGenerator).map((node) => node.value); beforeEach(() => { bst = new BinarySearchTree(); @@ -134,7 +134,7 @@ describe('Binary Search Tree', () => { // get keys expect(getValues(bst.inOrderTraversal())).toEqual([1, {}, 'dos']); // get data - expect(Array.from(bst.inOrderTraversal()).map(n => n.data())).toEqual([ + expect(Array.from(bst.inOrderTraversal()).map((n) => n.data())).toEqual([ 1, fn, 2, @@ -312,7 +312,7 @@ describe('Binary Search Tree', () => { it('should generate an array from dfs', () => { const nodes = Array.from(bst.dfs()); - const values = nodes.map(node => node.value); + const values = nodes.map((node) => node.value); expect(values).toEqual([10, 5, 4, 3, 30, 15, 40]); }); }); @@ -326,7 +326,7 @@ describe('Binary Search Tree', () => { describe('#preOrderTraversal', () => { it('should generate an array from preOrderTraversal', () => { const nodes = Array.from(bst.preOrderTraversal()); - const values = nodes.map(node => node.value); + const values = nodes.map((node) => node.value); expect(values).toEqual([10, 5, 4, 3, 30, 15, 40]); }); }); @@ -334,7 +334,7 @@ describe('Binary Search Tree', () => { describe('#postOrderTraversal', () => { it('should generate an array from postOrderTraversal', () => { const nodes = Array.from(bst.postOrderTraversal()); - const values = nodes.map(node => node.value); + const values = nodes.map((node) => node.value); expect(values).toEqual([3, 4, 5, 15, 40, 30, 10]); }); }); diff --git a/src/runtimes/07-sub-sets.js b/src/runtimes/07-sub-sets.js index f5c24262..f8da0e5b 100644 --- a/src/runtimes/07-sub-sets.js +++ b/src/runtimes/07-sub-sets.js @@ -18,7 +18,7 @@ function findSubsets(n = '') { const base = ['']; // <1> const results = array.reduce((previous, element) => { - const previousPlusElement = previous.map(el => `${el}${element}`); // <2> + const previousPlusElement = previous.map((el) => `${el}${element}`); // <2> return previous.concat(previousPlusElement); // <3> }, base); From 874f3eb27e13151712eca52701dea1073ea335ef Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 8 May 2020 15:20:32 -0400 Subject: [PATCH 063/200] :sparkles: feat (heap): Add Heap implementation (PriorityQueue) (#51) --- src/data-structures/trees/heap.js | 55 +++++++++ src/data-structures/trees/heap.spec.js | 152 +++++++++++++++++++++++++ src/index.js | 2 + 3 files changed, 209 insertions(+) create mode 100644 src/data-structures/trees/heap.js create mode 100644 src/data-structures/trees/heap.spec.js diff --git a/src/data-structures/trees/heap.js b/src/data-structures/trees/heap.js new file mode 100644 index 00000000..09032737 --- /dev/null +++ b/src/data-structures/trees/heap.js @@ -0,0 +1,55 @@ +class Heap { + constructor(comparator = (a, b) => a - b) { + this.array = []; + this.comparator = (i1, i2) => comparator(this.array[i1], this.array[i2]); + } + + add(value) { + this.array.push(value); + this.bubbleUp(); + } + + peek() { + return this.array[0]; + } + + remove() { + this.swap(0, this.size() - 1); + const value = this.array.pop(); + this.bubbleDown(); + return value; + } + + size() { + return this.array.length; + } + + bubbleUp() { + let index = this.size() - 1; + const parent = (i) => Math.ceil(i / 2 - 1); + while (parent(index) >= 0 && this.comparator(parent(index), index) > 0) { + this.swap(parent(index), index); + index = parent(index); + } + } + + bubbleDown() { + let index = 0; + const left = (i) => 2 * i + 1; + const right = (i) => 2 * i + 2; + const getTopChild = (i) => (right(i) < this.size() + && this.comparator(left(i), right(i)) > 0 ? right(i) : left(i)); + + while (left(index) < this.size() && this.comparator(index, getTopChild(index)) > 0) { + const next = getTopChild(index); + this.swap(index, next); + index = next; + } + } + + swap(i1, i2) { + [this.array[i1], this.array[i2]] = [this.array[i2], this.array[i1]]; + } +} + +module.exports = Heap; diff --git a/src/data-structures/trees/heap.spec.js b/src/data-structures/trees/heap.spec.js new file mode 100644 index 00000000..b50924d7 --- /dev/null +++ b/src/data-structures/trees/heap.spec.js @@ -0,0 +1,152 @@ +const Heap = require('./heap'); + +describe('Min-Heap (Priority Queue)', () => { + let heap; + + beforeEach(() => { + heap = new Heap(); + }); + + describe('#contructor', () => { + it('should initialize', () => { + expect(heap).not.toBe(undefined); + }); + }); + + describe('#add', () => { + it('should add an element', () => { + expect(heap.add(1)).toBe(undefined); + expect(heap.array).toEqual([1]); + expect(heap.size()).toBe(1); + }); + + it('should keep things in order', () => { + heap.add(3); + expect(heap.array[0]).toEqual(3); + heap.add(2); + expect(heap.array[0]).toEqual(2); + heap.add(1); + expect(heap.array[0]).toEqual(1); + expect(heap.size()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should work', () => { + heap.add(1); + heap.add(0); + expect(heap.remove()).toBe(0); + expect(heap.size()).toBe(1); + expect(heap.array).toEqual([1]); + }); + }); + + describe('when has elements', () => { + beforeEach(() => { + heap.add(1); + heap.add(2); + heap.add(3); + heap.add(0); + }); + + describe('#peek', () => { + it('should get min', () => { + expect(heap.peek()).toEqual(0); + }); + }); + + describe('#remove', () => { + it('should get min', () => { + expect(heap.remove()).toEqual(0); + expect(heap.remove()).toEqual(1); + expect(heap.remove()).toEqual(2); + expect(heap.remove()).toEqual(3); + expect(heap.size()).toBe(0); + }); + }); + }); +}); + +describe('Max-Heap (Priority Queue)', () => { + let heap; + + beforeEach(() => { + heap = new Heap((a, b) => b - a); + }); + + describe('#contructor', () => { + it('should initialize', () => { + expect(heap).not.toBe(undefined); + }); + }); + + describe('#add', () => { + it('should add an element', () => { + expect(heap.add(1)).toBe(undefined); + expect(heap.array).toEqual([1]); + expect(heap.size()).toBe(1); + }); + + it('should keep things in order', () => { + heap.add(1); + expect(heap.array[0]).toEqual(1); + heap.add(2); + expect(heap.array[0]).toEqual(2); + heap.add(3); + expect(heap.array[0]).toEqual(3); + expect(heap.size()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should work', () => { + heap.add(1); + heap.add(0); + expect(heap.remove()).toBe(1); + expect(heap.size()).toBe(1); + expect(heap.array).toEqual([0]); + }); + + it('should work with duplicates', () => { + heap.add(3); + heap.add(2); + heap.add(3); + heap.add(1); + heap.add(2); + heap.add(4); + heap.add(5); + heap.add(5); + heap.add(6); + + expect(heap.remove()).toEqual(6); + expect(heap.remove()).toEqual(5); + expect(heap.remove()).toEqual(5); + expect(heap.remove()).toEqual(4); + }); + }); + + describe('when has elements', () => { + beforeEach(() => { + heap.add(1); + heap.add(2); + heap.add(3); + heap.add(0); + }); + + describe('#peek', () => { + it('should get min', () => { + expect(heap.peek()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should get min when duplicates', () => { + expect(heap.remove()).toEqual(3); + expect(heap.remove()).toEqual(2); + expect(heap.remove()).toEqual(1); + expect(heap.remove()).toEqual(0); + expect(heap.size()).toBe(0); + }); + }); + }); +}); diff --git a/src/index.js b/src/index.js index 2c29579d..72cf1f06 100644 --- a/src/index.js +++ b/src/index.js @@ -15,6 +15,7 @@ const AvlTree = require('./data-structures/trees/avl-tree'); const RedBlackTree = require('./data-structures/trees/red-black-tree'); const LRUCache = require('./data-structures/custom/lru-cache'); const Trie = require('./data-structures/trees/trie'); +const Heap = require('./data-structures/trees/heap'); // algorithms const bubbleSort = require('./algorithms/sorting/bubble-sort'); @@ -40,6 +41,7 @@ module.exports = { RedBlackTree, LRUCache, Trie, + Heap, bubbleSort, insertionSort, selectionSort, From a4b87e80d097a9492751a7f3a7fa40fd4940b2bf Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 8 May 2020 15:47:37 -0400 Subject: [PATCH 064/200] :wrench: chore (ci): adjust semantic-release (#52) --- README.md | 25 ++++++++++++------------- package.json | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3acbc60d..84f4b7dd 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,6 @@ _Note: If you prefer to consume the information more linearly then the [book for The topics are divided into four main categories as you can see below: -_(You can click on the triangle ⯈ to expand the topics)_ ### 📈 [Algorithms Analysis](book/part01-algorithms-analysis.asc) @@ -103,7 +102,7 @@ _(You can click on the triangle ⯈ to expand the topics)_

- Computer Science nuggets without all the mumbo-jumbo + Computer Science nuggets without all the mumbo-jumbo. (Click to expand) --- @@ -120,7 +119,7 @@ _(You can click on the triangle ⯈ to expand the topics)_
- Learn how to compare algorithms using Big O notation. + Learn how to compare algorithms using Big O notation. (Click to expand) --- @@ -142,7 +141,7 @@ they take different time to complete.
- 8 examples to explain with code how to calculate time complexity + 8 examples to explain with code how to calculate time complexity. (Click to expand) --- @@ -181,7 +180,7 @@ they take different time to complete.
- Understand the ins and outs of the most common data structures. + Understand the ins and outs of the most common data structures. (Click to expand) --- @@ -216,7 +215,7 @@ they take different time to complete.
- When to use an Array or Linked List. Know the tradeoffs. + When to use an Array or Linked List. Know the tradeoffs. (Click to expand) --- @@ -239,7 +238,7 @@ Use Linked Lists when:
- Build a List, Stack, and a Queue. + Build a List, Stack, and a Queue. (Click to expand) --- @@ -264,7 +263,7 @@ Use Linked Lists when:
- Understand one of the most versatile data structure of all: Maps + Understand one of the most versatile data structure of all: Hash Maps. (Click to expand) --- @@ -289,7 +288,7 @@ Also, [learn the difference between the different Maps implementations](book/con
- Know the properties of Graphs and Trees. + Know the properties of Graphs and Trees. (Click to expand) --- @@ -391,7 +390,7 @@ From unbalanced BST to balanced BST
- Never get stuck solving a problem with 7 simple steps + Never get stuck solving a problem with 7 simple steps. (Click to expand) --- @@ -414,7 +413,7 @@ Full details [here](book/part04-algorithmic-toolbox.asc)
- Master the most popular sorting algorithms (merge sort, quicksort, insertion sort, etc.) + Master the most popular sorting algorithms (merge sort, quicksort, etc.) (Click to expand) --- @@ -453,7 +452,7 @@ and then discuss efficient sorting algorithms O(n log n) such as:
- Learn different approaches to solve problems such as divide and conquer, dynamic programming, greedy algorithms, and backtracking. + Learn different approaches to solve problems such as divide and conquer, dynamic programming, greedy algorithms, and backtracking. (Click to expand) --- @@ -475,7 +474,7 @@ We are going to discuss the following techniques for solving algorithms problems ## FAQ
- How would I apply these to my day-to-day work? + How would I apply these to my day-to-day work? (Click to expand)

As a programmer, we have to solve problems every day. If you want to solve problems well, then it's good to know about a broad range of solutions. A lot of times, it's more efficient to learn existing resources than stumble upon the answer yourself. The more tools and practice you have, the better. This book helps you understand the tradeoffs among data structures and reason about algorithms performance.

diff --git a/package.json b/package.json index e1bf8e25..e785c8da 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,21 @@ "tagFormat": "${version}", "branch": "master", "plugins": [ - "@semantic-release/commit-analyzer", + ["@semantic-release/commit-analyzer", { + "preset": "angular", + "releaseRules": [ + {"type": "fix", "release": "patch"}, + {"type": "feat", "release": "minor"}, + {"type": "break", "release": "major"}, + {"emoji": ":bug:", "release": "patch"}, + {"emoji": ":pencil:", "release": "patch"}, + {"emoji": ":sparkles:", "release": "minor"}, + {"emoji": ":boom:", "release": "major"} + ], + "parserOpts": { + "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"] + } + }], "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/github", From 419fd118a28d6bceb9f8914eb0da0cf3800cb7a8 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 8 May 2020 16:00:46 -0400 Subject: [PATCH 065/200] chore(semantic-release): fix matchers --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e785c8da..50562a55 100644 --- a/package.json +++ b/package.json @@ -109,10 +109,10 @@ {"type": "fix", "release": "patch"}, {"type": "feat", "release": "minor"}, {"type": "break", "release": "major"}, - {"emoji": ":bug:", "release": "patch"}, - {"emoji": ":pencil:", "release": "patch"}, - {"emoji": ":sparkles:", "release": "minor"}, - {"emoji": ":boom:", "release": "major"} + {"header": ":bug:*", "release": "patch"}, + {"header": ":pencil:*", "release": "patch"}, + {"header": ":sparkles:*", "release": "minor"}, + {"header": ":boom:*", "release": "major"} ], "parserOpts": { "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"] From 7279e5ca0374ba8290e47e162d5963ce733b13e9 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 8 May 2020 19:31:25 -0400 Subject: [PATCH 066/200] :wrench: chore (readme): update ci link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 84f4b7dd..660f62dc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Data Structures and Algorithms in JavaScript -[![CircleCI](https://img.shields.io/circleci/build/github/amejiarosario/dsa.js-data-structures-algorithms-javascript/master.svg)](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-and-algorithms-in-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![chat](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) +[![CircleCI](https://circleci.com/gh/amejiarosario/dsa.js-data-structures-algorithms-javascript.svg?style=shield)](https://app.circleci.com/pipelines/github/amejiarosario/dsa.js-data-structures-algorithms-javascript) [![NPM version](https://badge.fury.io/js/dsa.js.svg)](https://badge.fury.io/js/dsa.js) [![chat](https://dsajs-slackin.herokuapp.com/badge.svg)](https://dsajs-slackin.herokuapp.com) > This is the coding implementations of the [DSA.js book](https://books.adrianmejia.com/dsajs-data-structures-algorithms-javascript/) and the repo for the NPM package. From 28da0e11dbb69f247a8ba314b1a5dfc6a6776084 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 8 May 2020 23:36:25 +0000 Subject: [PATCH 067/200] :bookmark: chore(release): 1.6.0 # [1.6.0](https://github.com/amejiarosario/dsa.js/compare/1.5.0...1.6.0) (2020-05-08) --- CHANGELOG.md | 2 ++ package-lock.json | 2 +- package.json | 57 ++++++++++++++++++++++++++++++++++------------- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 666f4965..0aac51f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +# [1.6.0](https://github.com/amejiarosario/dsa.js/compare/1.5.0...1.6.0) (2020-05-08) + # [1.5.0](https://github.com/amejiarosario/dsa.js/compare/1.4.0...1.5.0) (2020-03-30) diff --git a/package-lock.json b/package-lock.json index dd37f702..ec11d700 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.5.0", + "version": "1.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 50562a55..9b545745 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.5.0", + "version": "1.6.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", @@ -103,21 +103,48 @@ "tagFormat": "${version}", "branch": "master", "plugins": [ - ["@semantic-release/commit-analyzer", { - "preset": "angular", - "releaseRules": [ - {"type": "fix", "release": "patch"}, - {"type": "feat", "release": "minor"}, - {"type": "break", "release": "major"}, - {"header": ":bug:*", "release": "patch"}, - {"header": ":pencil:*", "release": "patch"}, - {"header": ":sparkles:*", "release": "minor"}, - {"header": ":boom:*", "release": "major"} - ], - "parserOpts": { - "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"] + [ + "@semantic-release/commit-analyzer", + { + "preset": "angular", + "releaseRules": [ + { + "type": "fix", + "release": "patch" + }, + { + "type": "feat", + "release": "minor" + }, + { + "type": "break", + "release": "major" + }, + { + "header": ":bug:*", + "release": "patch" + }, + { + "header": ":pencil:*", + "release": "patch" + }, + { + "header": ":sparkles:*", + "release": "minor" + }, + { + "header": ":boom:*", + "release": "major" + } + ], + "parserOpts": { + "noteKeywords": [ + "BREAKING CHANGE", + "BREAKING CHANGES" + ] + } } - }], + ], "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/github", From 202ca9f989ddba433b4f591e27bc094640cbbadf Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 15 May 2020 20:49:46 -0400 Subject: [PATCH 068/200] feat(heap): add min/max/median-heaps --- src/data-structures/{trees => heaps}/heap.js | 44 +++++ src/data-structures/heaps/heap.spec.js | 164 ++++++++++++++++++ src/data-structures/heaps/max-heap.js | 8 + src/data-structures/heaps/median-heap.js | 75 ++++++++ src/data-structures/heaps/median-heap.spec.js | 61 +++++++ src/data-structures/heaps/min-heap.js | 8 + src/data-structures/heaps/priority-queue.js | 5 + src/data-structures/trees/heap.spec.js | 152 ---------------- src/index.js | 8 +- 9 files changed, 372 insertions(+), 153 deletions(-) rename src/data-structures/{trees => heaps}/heap.js (53%) create mode 100644 src/data-structures/heaps/heap.spec.js create mode 100644 src/data-structures/heaps/max-heap.js create mode 100644 src/data-structures/heaps/median-heap.js create mode 100644 src/data-structures/heaps/median-heap.spec.js create mode 100644 src/data-structures/heaps/min-heap.js create mode 100644 src/data-structures/heaps/priority-queue.js delete mode 100644 src/data-structures/trees/heap.spec.js diff --git a/src/data-structures/trees/heap.js b/src/data-structures/heaps/heap.js similarity index 53% rename from src/data-structures/trees/heap.js rename to src/data-structures/heaps/heap.js index 09032737..423f5663 100644 --- a/src/data-structures/trees/heap.js +++ b/src/data-structures/heaps/heap.js @@ -1,29 +1,58 @@ +/** + * Heap data structure a.k.a Priority Queue + * + * Used to get min or max values from a collection in constant time. + * + * @author Adrian Mejia + */ class Heap { constructor(comparator = (a, b) => a - b) { this.array = []; this.comparator = (i1, i2) => comparator(this.array[i1], this.array[i2]); } + /** + * Insert element + * @runtime O(log n) + * @param {any} value + */ add(value) { this.array.push(value); this.bubbleUp(); } + /** + * Retrieves, but does not remove, the head of this heap + * @runtime O(1) + */ peek() { return this.array[0]; } + /** + * Retrieves and removes the head of this heap, or returns null if this heap is empty. + * @runtime O(log n) + */ remove() { + if (!this.size()) return null; this.swap(0, this.size() - 1); const value = this.array.pop(); this.bubbleDown(); return value; } + /** + * Returns the number of elements in this collection. + * @runtime O(1) + */ size() { return this.array.length; } + /** + * Move new element upwards on the heap, if it's out of order + * @runtime O(log n) + */ bubbleUp() { let index = this.size() - 1; const parent = (i) => Math.ceil(i / 2 - 1); @@ -33,6 +62,10 @@ class Heap { } } + /** + * After removal, moves element downwards on the heap, if it's out of order + * @runtime O(log n) + */ bubbleDown() { let index = 0; const left = (i) => 2 * i + 1; @@ -47,9 +80,20 @@ class Heap { } } + /** + * "Private": Swap elements on the heap + * @runtime O(1) + * @param {number} i1 index 1 + * @param {number} i2 index 2 + */ swap(i1, i2) { [this.array[i1], this.array[i2]] = [this.array[i2], this.array[i1]]; } } +// aliases +Heap.prototype.poll = Heap.prototype.remove; +Heap.prototype.offer = Heap.prototype.add; +Heap.prototype.element = Heap.prototype.peek; + module.exports = Heap; diff --git a/src/data-structures/heaps/heap.spec.js b/src/data-structures/heaps/heap.spec.js new file mode 100644 index 00000000..855bc6cf --- /dev/null +++ b/src/data-structures/heaps/heap.spec.js @@ -0,0 +1,164 @@ +const Heap = require('./heap'); +const PriorityQueue = require('./priority-queue'); +const MaxHeap = require('./max-heap'); +const MinHeap = require('./min-heap'); + +[[Heap], [PriorityQueue], [MinHeap]].forEach(([DS, arg]) => { + describe('Min-Heap (Priority Queue)', () => { + let heap; + + beforeEach(() => { + heap = new DS(arg); + }); + + describe('#contructor', () => { + it('should initialize', () => { + expect(heap).not.toBe(undefined); + }); + }); + + describe('#add', () => { + it('should add an element', () => { + expect(heap.add(1)).toBe(undefined); + expect(heap.array).toEqual([1]); + expect(heap.size()).toBe(1); + }); + + it('should keep things in order', () => { + heap.add(3); + expect(heap.array[0]).toEqual(3); + heap.add(2); + expect(heap.array[0]).toEqual(2); + heap.add(1); + expect(heap.array[0]).toEqual(1); + expect(heap.size()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should work', () => { + heap.add(1); + heap.add(0); + expect(heap.remove()).toBe(0); + expect(heap.size()).toBe(1); + expect(heap.array).toEqual([1]); + }); + + it('should return null if empty', () => { + heap = new Heap(); + expect(heap.remove()).toBe(null); + }); + }); + + describe('when has elements', () => { + beforeEach(() => { + heap.add(1); + heap.add(2); + heap.add(3); + heap.add(0); + }); + + describe('#peek', () => { + it('should get min', () => { + expect(heap.peek()).toEqual(0); + }); + }); + + describe('#remove', () => { + it('should get min', () => { + expect(heap.remove()).toEqual(0); + expect(heap.remove()).toEqual(1); + expect(heap.remove()).toEqual(2); + expect(heap.remove()).toEqual(3); + expect(heap.size()).toBe(0); + }); + }); + }); + }); +}); + +[[Heap, (a, b) => b - a], [PriorityQueue, (a, b) => b - a], [MaxHeap]].forEach(([DS, arg]) => { + describe('Max-Heap (Priority Queue)', () => { + let heap; + + beforeEach(() => { + heap = new DS(arg); + }); + + describe('#contructor', () => { + it('should initialize', () => { + expect(heap).not.toBe(undefined); + }); + }); + + describe('#add', () => { + it('should add an element', () => { + expect(heap.add(1)).toBe(undefined); + expect(heap.array).toEqual([1]); + expect(heap.size()).toBe(1); + }); + + it('should keep things in order', () => { + heap.add(1); + expect(heap.array[0]).toEqual(1); + heap.add(2); + expect(heap.array[0]).toEqual(2); + heap.add(3); + expect(heap.array[0]).toEqual(3); + expect(heap.size()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should work', () => { + heap.add(1); + heap.add(0); + expect(heap.remove()).toBe(1); + expect(heap.size()).toBe(1); + expect(heap.array).toEqual([0]); + }); + + it('should work with duplicates', () => { + heap.add(3); + heap.add(2); + heap.add(3); + heap.add(1); + heap.add(2); + heap.add(4); + heap.add(5); + heap.add(5); + heap.add(6); + + expect(heap.remove()).toEqual(6); + expect(heap.remove()).toEqual(5); + expect(heap.remove()).toEqual(5); + expect(heap.remove()).toEqual(4); + }); + }); + + describe('when has elements', () => { + beforeEach(() => { + heap.add(1); + heap.add(2); + heap.add(3); + heap.add(0); + }); + + describe('#peek', () => { + it('should get min', () => { + expect(heap.peek()).toEqual(3); + }); + }); + + describe('#remove', () => { + it('should get min when duplicates', () => { + expect(heap.remove()).toEqual(3); + expect(heap.remove()).toEqual(2); + expect(heap.remove()).toEqual(1); + expect(heap.remove()).toEqual(0); + expect(heap.size()).toBe(0); + }); + }); + }); + }); +}); diff --git a/src/data-structures/heaps/max-heap.js b/src/data-structures/heaps/max-heap.js new file mode 100644 index 00000000..46dbb89e --- /dev/null +++ b/src/data-structures/heaps/max-heap.js @@ -0,0 +1,8 @@ +const Heap = require('./heap'); + +class MaxHeap extends Heap { + constructor() { + super((a, b) => b - a); + } +} +module.exports = MaxHeap; diff --git a/src/data-structures/heaps/median-heap.js b/src/data-structures/heaps/median-heap.js new file mode 100644 index 00000000..75c29b79 --- /dev/null +++ b/src/data-structures/heaps/median-heap.js @@ -0,0 +1,75 @@ +const Heap = require('./heap'); + +/** + * Median Heap using one MaxHeap and one MinHeap. + * + * Each heap contains about one half of the data. + * Every element in the min-heap is greater or equal to the median, + * and every element in the max-heap is less or equal to the median. + * + * @author Adrian Mejia + */ +class MedianHeap { + constructor() { + this.min = new Heap((a, b) => a - b); + this.max = new Heap((a, b) => b - a); + } + + /** + * Add a value to the heap + * @runtime O(log n) + * @param {any} value + */ + add(value) { + if (value > this.findMedian()) { + // If the new element is greater than the current median, it goes to the min-heap. + this.min.add(value); + } else { + // If it is less than the current median, it goes to the max heap. + this.max.add(value); + } + + // rebalance if the sizes of the heaps differ by more than one element + if (Math.abs(this.min.size() - this.max.size()) > 1) { + // extract the min/max from the heap with more elements and insert it into the other heap. + if (this.min.size() > this.max.size()) { + this.max.add(this.min.remove()); + } else { + this.min.add(this.max.remove()); + } + } + } + + /** + * Find median + * @runtime O(1) + */ + findMedian() { + let median; + + if (this.max.size() === this.min.size()) { + // When both heaps contain the same number of elements, + // the total number of elements is even. + // The median is the mean of the two middle elements. + median = (this.max.peek() + this.min.peek()) / 2; + } else if (this.max.size() > this.min.size()) { + // when the max-heap contains one more element than the min-heap, + // the median is in the top of the max-heap. + median = this.max.peek(); + } else { + // When the min-heap contains one more element than the max-heap, + // the median is in the top of the min-heap. + median = this.min.peek(); + } + return median; + } + + /** + * Return size of the heap. + */ + size() { + return this.min.size() + this.max.size(); + } +} + +module.exports = MedianHeap; diff --git a/src/data-structures/heaps/median-heap.spec.js b/src/data-structures/heaps/median-heap.spec.js new file mode 100644 index 00000000..283df75d --- /dev/null +++ b/src/data-structures/heaps/median-heap.spec.js @@ -0,0 +1,61 @@ +const MedianHeap = require('./median-heap'); + +describe('Median Heap', () => { + let medianHeap; + + beforeEach(() => { + medianHeap = new MedianHeap(); + }); + + describe('#add', () => { + it('should work', () => { + expect(medianHeap.add(1)).toEqual(undefined); + expect(medianHeap.size()).toEqual(1); + }); + + it('should work', () => { + expect(medianHeap.add(1)).toEqual(undefined); + expect(medianHeap.add(1)).toEqual(undefined); + expect(medianHeap.size()).toEqual(2); + }); + }); + + describe('#findMedian', () => { + it('should work', () => { + medianHeap.add(5); + expect(medianHeap.findMedian()).toEqual(5); + medianHeap.add(15); + expect(medianHeap.findMedian()).toEqual(10); + medianHeap.add(10); + expect(medianHeap.findMedian()).toEqual(10); + }); + + it('should work', () => { + const values = [5, 15, 1, 3]; + const medians = values.map((v) => { + medianHeap.add(v); + return medianHeap.findMedian(); + }); + expect(medians).toEqual([5, 10, 5, 4]); + }); + + it('should work', () => { + const values = [2, 4, 7, 1, 5, 3]; + const medians = values.map((v) => { + medianHeap.add(v); + return medianHeap.findMedian(); + }); + expect(medians).toEqual([2, 3, 4, 3, 4, 3.5]); + }); + + it('should work with negative numbers', () => { + const values = [-1, -2, -3]; + const expected = [-1, -1.5, -2]; + const medians = values.map((v) => { + medianHeap.add(v); + return medianHeap.findMedian(); + }); + expect(medians).toEqual(expected); + }); + }); +}); diff --git a/src/data-structures/heaps/min-heap.js b/src/data-structures/heaps/min-heap.js new file mode 100644 index 00000000..0b77c760 --- /dev/null +++ b/src/data-structures/heaps/min-heap.js @@ -0,0 +1,8 @@ +const Heap = require('./heap'); + +class MinHeap extends Heap { + constructor() { + super((a, b) => a - b); + } +} +module.exports = MinHeap; diff --git a/src/data-structures/heaps/priority-queue.js b/src/data-structures/heaps/priority-queue.js new file mode 100644 index 00000000..622af6a9 --- /dev/null +++ b/src/data-structures/heaps/priority-queue.js @@ -0,0 +1,5 @@ +const Heap = require('./heap'); + +class PriorityQueue extends Heap { } + +module.exports = PriorityQueue; diff --git a/src/data-structures/trees/heap.spec.js b/src/data-structures/trees/heap.spec.js deleted file mode 100644 index b50924d7..00000000 --- a/src/data-structures/trees/heap.spec.js +++ /dev/null @@ -1,152 +0,0 @@ -const Heap = require('./heap'); - -describe('Min-Heap (Priority Queue)', () => { - let heap; - - beforeEach(() => { - heap = new Heap(); - }); - - describe('#contructor', () => { - it('should initialize', () => { - expect(heap).not.toBe(undefined); - }); - }); - - describe('#add', () => { - it('should add an element', () => { - expect(heap.add(1)).toBe(undefined); - expect(heap.array).toEqual([1]); - expect(heap.size()).toBe(1); - }); - - it('should keep things in order', () => { - heap.add(3); - expect(heap.array[0]).toEqual(3); - heap.add(2); - expect(heap.array[0]).toEqual(2); - heap.add(1); - expect(heap.array[0]).toEqual(1); - expect(heap.size()).toEqual(3); - }); - }); - - describe('#remove', () => { - it('should work', () => { - heap.add(1); - heap.add(0); - expect(heap.remove()).toBe(0); - expect(heap.size()).toBe(1); - expect(heap.array).toEqual([1]); - }); - }); - - describe('when has elements', () => { - beforeEach(() => { - heap.add(1); - heap.add(2); - heap.add(3); - heap.add(0); - }); - - describe('#peek', () => { - it('should get min', () => { - expect(heap.peek()).toEqual(0); - }); - }); - - describe('#remove', () => { - it('should get min', () => { - expect(heap.remove()).toEqual(0); - expect(heap.remove()).toEqual(1); - expect(heap.remove()).toEqual(2); - expect(heap.remove()).toEqual(3); - expect(heap.size()).toBe(0); - }); - }); - }); -}); - -describe('Max-Heap (Priority Queue)', () => { - let heap; - - beforeEach(() => { - heap = new Heap((a, b) => b - a); - }); - - describe('#contructor', () => { - it('should initialize', () => { - expect(heap).not.toBe(undefined); - }); - }); - - describe('#add', () => { - it('should add an element', () => { - expect(heap.add(1)).toBe(undefined); - expect(heap.array).toEqual([1]); - expect(heap.size()).toBe(1); - }); - - it('should keep things in order', () => { - heap.add(1); - expect(heap.array[0]).toEqual(1); - heap.add(2); - expect(heap.array[0]).toEqual(2); - heap.add(3); - expect(heap.array[0]).toEqual(3); - expect(heap.size()).toEqual(3); - }); - }); - - describe('#remove', () => { - it('should work', () => { - heap.add(1); - heap.add(0); - expect(heap.remove()).toBe(1); - expect(heap.size()).toBe(1); - expect(heap.array).toEqual([0]); - }); - - it('should work with duplicates', () => { - heap.add(3); - heap.add(2); - heap.add(3); - heap.add(1); - heap.add(2); - heap.add(4); - heap.add(5); - heap.add(5); - heap.add(6); - - expect(heap.remove()).toEqual(6); - expect(heap.remove()).toEqual(5); - expect(heap.remove()).toEqual(5); - expect(heap.remove()).toEqual(4); - }); - }); - - describe('when has elements', () => { - beforeEach(() => { - heap.add(1); - heap.add(2); - heap.add(3); - heap.add(0); - }); - - describe('#peek', () => { - it('should get min', () => { - expect(heap.peek()).toEqual(3); - }); - }); - - describe('#remove', () => { - it('should get min when duplicates', () => { - expect(heap.remove()).toEqual(3); - expect(heap.remove()).toEqual(2); - expect(heap.remove()).toEqual(1); - expect(heap.remove()).toEqual(0); - expect(heap.size()).toBe(0); - }); - }); - }); -}); diff --git a/src/index.js b/src/index.js index 72cf1f06..9d8e8a4a 100644 --- a/src/index.js +++ b/src/index.js @@ -15,7 +15,10 @@ const AvlTree = require('./data-structures/trees/avl-tree'); const RedBlackTree = require('./data-structures/trees/red-black-tree'); const LRUCache = require('./data-structures/custom/lru-cache'); const Trie = require('./data-structures/trees/trie'); -const Heap = require('./data-structures/trees/heap'); +const Heap = require('./data-structures/heaps/heap'); +const MinHeap = require('./data-structures/heaps/min-heap'); +const MaxHeap = require('./data-structures/heaps/max-heap'); +const PriorityQueue = require('./data-structures/heaps/priority-queue'); // algorithms const bubbleSort = require('./algorithms/sorting/bubble-sort'); @@ -42,6 +45,9 @@ module.exports = { LRUCache, Trie, Heap, + MinHeap, + MaxHeap, + PriorityQueue, bubbleSort, insertionSort, selectionSort, From 1bb097d86bee44d1f7bc2886cd802eac0db56b2c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 15 May 2020 20:56:52 -0400 Subject: [PATCH 069/200] chore(docs): add comments --- CONTRIBUTING.md | 2 +- lab/exercises/10-mixed/min-permutations.js | 34 + .../10-mixed/min-permutations.spec.js | 7 + package-lock.json | 18645 +++++++--------- package.json | 77 +- .../maps/hash-maps/hash-map.js | 2 +- 6 files changed, 7797 insertions(+), 10970 deletions(-) create mode 100644 lab/exercises/10-mixed/min-permutations.js create mode 100644 lab/exercises/10-mixed/min-permutations.spec.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eeff4b34..3f0989d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -165,7 +165,7 @@ Just as in the **subject**, use the imperative, present tense: "change" not "cha The body should include the motivation for the change and contrast this with previous behavior. ### Footer -The footer should contain any information about **Breaking Changes** and is also the place to +The footer should contain any information about **BREAKING CHANGES** and is also the place to reference GitHub issues that this commit **Closes**. ``` diff --git a/lab/exercises/10-mixed/min-permutations.js b/lab/exercises/10-mixed/min-permutations.js new file mode 100644 index 00000000..d767f3bf --- /dev/null +++ b/lab/exercises/10-mixed/min-permutations.js @@ -0,0 +1,34 @@ +/*eslint-disable */ + +function reverse (arr, i, j) { + while (i < j) { + [arr[i], arr[j]] = [arr[j], arr[i]]; + i++; + j--; + } +} + +function backtracking(array, start = 0) { + let permutations = [array]; + + for (let i = start; i < array.length - 1; i++) { + for (let j = i + 1; j < array.length; j++) { + reverse(array, i, j); + permutations = permutations.concat(backtracking(array, i + 1)); + reverse(array, i, j); + } + } + + return permutations; +} + +function minPermutations(arr) { + return backtracking(arr); +} + +module.exports = minPermutations; + +//*/ +// console.log(backtracking([1,2,3])); +// console.log(backtracking([1,2,3,4])); +//*/ diff --git a/lab/exercises/10-mixed/min-permutations.spec.js b/lab/exercises/10-mixed/min-permutations.spec.js new file mode 100644 index 00000000..f506e668 --- /dev/null +++ b/lab/exercises/10-mixed/min-permutations.spec.js @@ -0,0 +1,7 @@ +const fn = require('./min-permutations'); + +describe('Min Permutations', () => { + it('should work', () => { + expect(fn([1,2,3])).toEqual(); + }); +}); diff --git a/package-lock.json b/package-lock.json index dd37f702..6eef02ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,28 +5,28 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", + "@babel/generator": "^7.9.6", "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -37,35 +37,6 @@ "source-map": "^0.5.0" }, "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==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -75,27 +46,15 @@ "ms": "^2.1.1" } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -105,12 +64,12 @@ } }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", "dev": true, "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -131,14 +90,14 @@ } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { @@ -199,15 +158,15 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "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==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/helper-simple-access": { @@ -230,30 +189,30 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -266,11 +225,20 @@ } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", "dev": true }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", @@ -280,6 +248,51 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", + "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@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", @@ -289,10 +302,28 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -315,73 +346,25 @@ "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6" - }, - "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==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } } }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^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.0", - "@babel/types": "^7.9.0", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" }, "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==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -391,21 +374,21 @@ "ms": "^2.1.1" } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" }, @@ -445,15 +428,6 @@ "cosmiconfig": "^5.2.0", "lodash": "4.17.15", "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==", - "dev": true, - "optional": true - } } }, "@commitlint/resolve-extends": { @@ -467,15 +441,6 @@ "lodash": "4.17.15", "resolve-from": "^5.0.0", "resolve-global": "^1.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==", - "dev": true, - "optional": true - } } }, "@istanbuljs/load-nyc-config": { @@ -516,9 +481,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -544,12 +509,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true } } }, @@ -560,14 +519,15 @@ "dev": true }, "@jest/console": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", - "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", + "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", - "chalk": "^3.0.0", - "jest-util": "^25.2.6", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-message-util": "^26.0.1", + "jest-util": "^26.0.1", "slash": "^3.0.0" }, "dependencies": { @@ -582,9 +542,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -630,36 +590,35 @@ } }, "@jest/core": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", - "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", + "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/reporters": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^26.0.1", + "@jest/reporters": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.2.6", - "jest-config": "^25.2.7", - "jest-haste-map": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-resolve-dependencies": "^25.2.7", - "jest-runner": "^25.2.7", - "jest-runtime": "^25.2.7", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", - "jest-watcher": "^25.2.7", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.0.1", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-resolve-dependencies": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "jest-watcher": "^26.0.1", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", - "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" @@ -691,9 +650,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -715,6 +674,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -731,12 +696,6 @@ "picomatch": "^2.0.5" } }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -779,65 +738,77 @@ } }, "@jest/environment": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", - "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", + "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", "dev": true, "requires": { - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6" + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1" } }, "@jest/fake-timers": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", - "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", + "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "@sinonjs/fake-timers": "^6.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" + } + }, + "@jest/globals": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", + "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", - "lolex": "^5.0.0" + "@jest/environment": "^26.0.1", + "@jest/types": "^26.0.1", + "expect": "^26.0.1" } }, "@jest/reporters": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", - "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", + "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", + "@jest/console": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", - "node-notifier": "^6.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "node-notifier": "^7.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^3.1.0", + "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" + "v8-to-istanbul": "^4.1.3" }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -851,9 +822,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -884,6 +855,12 @@ "ms": "^2.1.1" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -891,11 +868,14 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "optional": true + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -904,15 +884,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -951,17 +928,27 @@ } }, "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.0.tgz", + "integrity": "sha512-y8ThJESxsHcak81PGpzWwQKxzk+5YtP3IxR8AYdpXQ1IB6FmcVzFdZXrkPin49F/DKUCfeeiziB8ptY9npzGuA==", "dev": true, "optional": true, "requires": { "growly": "^1.3.0", "is-wsl": "^2.1.1", - "semver": "^6.3.0", + "semver": "^7.2.1", "shellwords": "^0.1.1", - "which": "^1.3.1" + "uuid": "^7.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + } } }, "semver": { @@ -977,22 +964,22 @@ "dev": true }, "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "supports-color": { @@ -1003,71 +990,96 @@ "requires": { "has-flag": "^4.0.0" } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", + "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true } } }, "@jest/test-result": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", - "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", + "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^26.0.1", + "@jest/types": "^26.0.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", - "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", + "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", "dev": true, "requires": { - "@jest/test-result": "^25.2.6", - "jest-haste-map": "^25.2.6", - "jest-runner": "^25.2.7", - "jest-runtime": "^25.2.7" + "@jest/test-result": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "@jest/transform": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", - "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", + "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.2.6", + "@jest/types": "^26.0.1", "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.2.6", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.0.1", "micromatch": "^4.0.2", "pirates": "^4.0.1", - "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" @@ -1097,9 +1109,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1121,6 +1133,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1134,15 +1152,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -1158,12 +1173,6 @@ "picomatch": "^2.0.5" } }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -1211,15 +1220,15 @@ } }, "@jest/types": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", - "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", + "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -1233,9 +1242,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1310,26 +1319,26 @@ } }, "@octokit/core": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.4.3.tgz", - "integrity": "sha512-9T91nYeBB7+PNK3oxOuA+6DXCPRvhJ80ke+NqhXirBjVtNepTKFJXoWPqguRSBQ+dkEVA8dZJMxfFzjz9yhiuA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.0.tgz", + "integrity": "sha512-uvzmkemQrBgD8xuGbjhxzJN1darJk9L2cS+M99cHrDG2jlSVpxNJVhoV86cXdYBqdHCc9Z995uLCczaaHIYA6Q==", "dev": true, "requires": { "@octokit/auth-token": "^2.4.0", "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.3.1", + "@octokit/request": "^5.4.0", "@octokit/types": "^2.0.0", "before-after-hook": "^2.1.0", "universal-user-agent": "^5.0.0" } }, "@octokit/endpoint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.0.tgz", - "integrity": "sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.1.tgz", + "integrity": "sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A==", "dev": true, "requires": { - "@octokit/types": "^2.0.0", + "@octokit/types": "^2.11.1", "is-plain-object": "^3.0.0", "universal-user-agent": "^5.0.0" }, @@ -1352,34 +1361,23 @@ } }, "@octokit/graphql": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", - "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.4.0.tgz", + "integrity": "sha512-Du3hAaSROQ8EatmYoSAJjzAz3t79t9Opj/WY1zUgxVUGfIKn0AEjg+hlOLscF6fv6i/4y/CeUvsWgIfwMkTccw==", "dev": true, "requires": { "@octokit/request": "^5.3.0", "@octokit/types": "^2.0.0", - "universal-user-agent": "^4.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - } + "universal-user-agent": "^5.0.0" } }, "@octokit/plugin-paginate-rest": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz", - "integrity": "sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.0.tgz", + "integrity": "sha512-KoNxC3PLNar8UJwR+1VMQOw2IoOrrFdo5YOiDKnBhpVbKpw+zkBKNMNKwM44UWL25Vkn0Sl3nYIEGKY+gW5ebw==", "dev": true, "requires": { - "@octokit/types": "^2.0.1" + "@octokit/types": "^2.12.1" } }, "@octokit/plugin-request-log": { @@ -1389,24 +1387,24 @@ "dev": true }, "@octokit/plugin-rest-endpoint-methods": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.4.0.tgz", - "integrity": "sha512-Tvctk0u5SVrSLAzi8SLo0KrLSBl5biAHBgWy3L65vsbO/2fjzr62HVkoDPyr+WRT+eHhhqpKAERF3dQWOIUOvQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.11.0.tgz", + "integrity": "sha512-D31cBYhlOt6Om2xNkCNZUjyWdaDKUfa4HwpLwL8Dnu8aDuVuuOPLUhFMUDE0GvfqlNQFrNtU7n5HaZm+KmRdsw==", "dev": true, "requires": { - "@octokit/types": "^2.0.1", + "@octokit/types": "^2.16.0", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.4.tgz", - "integrity": "sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.2.tgz", + "integrity": "sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw==", "dev": true, "requires": { - "@octokit/endpoint": "^6.0.0", + "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", - "@octokit/types": "^2.0.0", + "@octokit/types": "^2.11.1", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", @@ -1443,21 +1441,21 @@ } }, "@octokit/rest": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.1.4.tgz", - "integrity": "sha512-LGghhepxoXyvi7ew0OdedrlwXQog8gvTbcdXoQ6RDKnzoYW2rBpcqeWC4fTuPUp9K0UEykcMix8kFnQ5b+64JQ==", + "version": "17.9.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.9.0.tgz", + "integrity": "sha512-Ff2jwS2OizWVaiCozOJevQ97V+mKjlQAt//lU6a/lhWDfHsZLXm/k1RsyTKVbyuiriDi7pg899wCU59nYfKnmQ==", "dev": true, "requires": { "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.0.0", + "@octokit/plugin-paginate-rest": "^2.2.0", "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.4.0" + "@octokit/plugin-rest-endpoint-methods": "3.11.0" } }, "@octokit/types": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.1.tgz", - "integrity": "sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", "dev": true, "requires": { "@types/node": ">= 8" @@ -1688,9 +1686,9 @@ } }, "@semantic-release/github": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", - "integrity": "sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.6.tgz", + "integrity": "sha512-70fUj+t98AWRgeOG0j2kdguvaVyysOZRUmXykZBwkktSDm1UZ6YfelYFPuM9OJbKPuNjKsCsRXl5/wukDUg8PA==", "dev": true, "requires": { "@octokit/rest": "^17.0.0", @@ -1772,9 +1770,9 @@ }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -1783,9 +1781,9 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -1878,12 +1876,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -1897,24 +1889,15 @@ } }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "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==", - "dev": true, - "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==", + "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==", "dev": true }, "universalify": { @@ -1990,9 +1973,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -2071,18 +2054,27 @@ } }, "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@types/babel__core": { @@ -2118,9 +2110,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", - "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -2132,10 +2124,19 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==", "dev": true }, "@types/istanbul-lib-report": { @@ -2148,9 +2149,9 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", @@ -2163,10 +2164,16 @@ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, "@types/node": { - "version": "13.9.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", - "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", + "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", "dev": true }, "@types/normalize-package-data": { @@ -2182,9 +2189,9 @@ "dev": true }, "@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.0.tgz", + "integrity": "sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q==", "dev": true }, "@types/retry": { @@ -2200,9 +2207,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2215,32 +2222,21 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", - "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.33.0.tgz", + "integrity": "sha512-qzPM2AuxtMrRq78LwyZa8Qn6gcY8obkIrBs1ehqmQADwkYzTE1Pb4y2W+U3rE/iFkSWcWHG2LS6MJfj6SmHApg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.26.0", + "@typescript-eslint/typescript-estree": "2.33.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } } }, "@typescript-eslint/typescript-estree": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", - "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.33.0.tgz", + "integrity": "sha512-d8rY6/yUxb0+mEwTShCQF2zYQdLlqihukNfG9IUlLYz5y1CH6G/9XYbrxQLq3Z14RNvkCC6oe+OcFlyUpwUbkg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -2248,7 +2244,7 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { @@ -2291,9 +2287,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -2309,31 +2305,25 @@ } }, "abab": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", - "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true } } @@ -2345,9 +2335,9 @@ "dev": true }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true }, "add-stream": { @@ -2395,9 +2385,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -2412,510 +2402,157 @@ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, + "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==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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==", + "dev": true, + "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.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "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==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "has": "^1.0.3" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==", + "dev": true + }, + "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==", "dev": true, "requires": { - "ms": "2.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.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=", + "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==", "dev": true, "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } } } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "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==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "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==", - "dev": true, - "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.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.17.0-next.1" }, "dependencies": { "es-abstract": { @@ -3000,9 +2637,9 @@ } }, "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, "asciidoctor.js": { @@ -3041,21 +2678,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "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==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3081,142 +2703,24 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, "babel-jest": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", - "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", + "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", "dev": true, "requires": { - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", - "@types/babel__core": "^7.1.0", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.2.6", - "chalk": "^3.0.0", + "babel-preset-jest": "^26.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "dependencies": { @@ -3244,9 +2748,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3268,6 +2772,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3281,15 +2791,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -3329,83 +2836,43 @@ } } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, "babel-plugin-jest-hoist": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", - "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", + "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", "@types/babel__traverse": "^7.0.6" } }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-preset-jest": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", - "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", + "babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", "dev": true, "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.2.6" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^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-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "babel-preset-jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", + "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } + "babel-plugin-jest-hoist": "^26.0.0", + "babel-preset-current-node-syntax": "^0.1.2" } }, "babel-runtime": { @@ -3413,82 +2880,12 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, + "optional": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -3553,12 +2950,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -3587,16 +2978,6 @@ "platform": "^1.3.3" } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bottleneck": { "version": "2.19.5", "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", @@ -3623,28 +3004,11 @@ } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -3710,30 +3074,45 @@ } } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, + "optional": true, "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" + "caller-callsite": "^2.0.0" } }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } } }, "cardinal": { @@ -3783,16 +3162,10 @@ } } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "class-utils": { @@ -3848,80 +3221,10 @@ "colors": "1.0.3" } }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - } - }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "co": { @@ -3930,12 +3233,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -3990,13 +3287,13 @@ "optional": true }, "commitizen": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.0.3.tgz", - "integrity": "sha512-lxu0F/Iq4dudoFeIl5pY3h3CQJzkmQuh3ygnaOvqhAD8Wu2pYBI17ofqSuPHNsBTEOh1r1AVa9kR4Hp0FAHKcQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.1.2.tgz", + "integrity": "sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ==", "dev": true, "requires": { "cachedir": "2.2.0", - "cz-conventional-changelog": "3.0.1", + "cz-conventional-changelog": "3.2.0", "dedent": "0.7.0", "detect-indent": "6.0.0", "find-node-modules": "2.0.0", @@ -4006,130 +3303,29 @@ "inquirer": "6.5.0", "is-utf8": "^0.2.1", "lodash": "4.17.15", - "minimist": "1.2.0", - "shelljs": "0.7.6", + "minimist": "1.2.5", "strip-bom": "4.0.0", "strip-json-comments": "3.0.1" }, "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==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "conventional-commit-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz", - "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==", - "dev": true - }, - "cz-conventional-changelog": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.0.1.tgz", - "integrity": "sha512-7KASIwB8/ClEyCRvQrCPbN7WkQnUSjSSVNyPM+gDJ0jskLi8h8N2hrdpyeCk7fIqKMRzziqVSOBTB8yyLTMHGQ==", - "dev": true, - "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "conventional-commit-types": "^2.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "right-pad": "^1.0.1", - "word-wrap": "^1.0.3" - } - }, "detect-indent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "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" - } - }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true } } }, "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", "dev": true, "requires": { "array-ify": "^1.0.0", @@ -4167,28 +3363,28 @@ "dev": true }, "conventional-changelog": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz", - "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==", + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.21.tgz", + "integrity": "sha512-ZGecVZPEo3aC75VVE4nu85589dDhpMyqfqgUM5Myq6wfKWiNqhDJLSDMsc8qKXshZoY7dqs1hR0H/15kI/G2jQ==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.6", - "conventional-changelog-atom": "^2.0.3", - "conventional-changelog-codemirror": "^2.0.3", - "conventional-changelog-conventionalcommits": "^4.2.3", - "conventional-changelog-core": "^4.1.4", - "conventional-changelog-ember": "^2.0.4", - "conventional-changelog-eslint": "^3.0.4", - "conventional-changelog-express": "^2.0.1", - "conventional-changelog-jquery": "^3.0.6", - "conventional-changelog-jshint": "^2.0.3", - "conventional-changelog-preset-loader": "^2.3.0" + "conventional-changelog-angular": "^5.0.10", + "conventional-changelog-atom": "^2.0.7", + "conventional-changelog-codemirror": "^2.0.7", + "conventional-changelog-conventionalcommits": "^4.3.0", + "conventional-changelog-core": "^4.1.7", + "conventional-changelog-ember": "^2.0.8", + "conventional-changelog-eslint": "^3.0.8", + "conventional-changelog-express": "^2.0.5", + "conventional-changelog-jquery": "^3.0.10", + "conventional-changelog-jshint": "^2.0.7", + "conventional-changelog-preset-loader": "^2.3.4" } }, "conventional-changelog-angular": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", - "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz", + "integrity": "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -4196,40 +3392,40 @@ } }, "conventional-changelog-atom": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", - "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.7.tgz", + "integrity": "sha512-7dOREZwzB+tCEMjRTDfen0OHwd7vPUdmU0llTy1eloZgtOP4iSLVzYIQqfmdRZEty+3w5Jz+AbhfTJKoKw1JeQ==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-cli": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz", - "integrity": "sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA==", + "version": "2.0.34", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.34.tgz", + "integrity": "sha512-HDDIhhpsMKiiAfH/mbj7wApgN7uA33Nk4hISY3/7ijlfqXc/bmP3v4o3Yialoxz0iTBibc94xi6kfTH7XIvwDw==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog": "^3.1.18", + "conventional-changelog": "^3.1.21", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "tempfile": "^3.0.0" } }, "conventional-changelog-codemirror": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", - "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.7.tgz", + "integrity": "sha512-Oralk1kiagn3Gb5cR5BffenWjVu59t/viE6UMD/mQa1hISMPkMYhJIqX+CMeA1zXgVBO+YHQhhokEj99GP5xcg==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-conventionalcommits": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", - "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz", + "integrity": "sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -4238,24 +3434,25 @@ } }, "conventional-changelog-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz", - "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.7.tgz", + "integrity": "sha512-UBvSrQR2RdKbSQKh7RhueiiY4ZAIOW3+CSWdtKOwRv+KxIMNFKm1rOcGBFx0eA8AKhGkkmmacoTWJTqyz7Q0VA==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.11", - "conventional-commits-parser": "^3.0.8", + "conventional-changelog-writer": "^4.0.16", + "conventional-commits-parser": "^3.1.0", "dateformat": "^3.0.0", "get-pkg-repo": "^1.0.0", "git-raw-commits": "2.0.0", "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^3.0.1", + "git-semver-tags": "^4.0.0", "lodash": "^4.17.15", "normalize-package-data": "^2.3.5", "q": "^1.5.1", "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", + "shelljs": "^0.8.3", "through2": "^3.0.0" }, "dependencies": { @@ -4320,45 +3517,45 @@ } }, "conventional-changelog-ember": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", - "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.8.tgz", + "integrity": "sha512-JEMEcUAMg4Q9yxD341OgWlESQ4gLqMWMXIWWUqoQU8yvTJlKnrvcui3wk9JvnZQyONwM2g1MKRZuAjKxr8hAXA==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-eslint": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", - "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.8.tgz", + "integrity": "sha512-5rTRltgWG7TpU1PqgKHMA/2ivjhrB+E+S7OCTvj0zM/QGg4vmnVH67Vq/EzvSNYtejhWC+OwzvDrLk3tqPry8A==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-express": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", - "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.5.tgz", + "integrity": "sha512-pW2hsjKG+xNx/Qjof8wYlAX/P61hT5gQ/2rZ2NsTpG+PgV7Rc8RCfITvC/zN9K8fj0QmV6dWmUefCteD9baEAw==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-jquery": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", - "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.10.tgz", + "integrity": "sha512-QCW6wF8QgPkq2ruPaxc83jZxoWQxLkt/pNxIDn/oYjMiVgrtqNdd7lWe3vsl0hw5ENHNf/ejXuzDHk6suKsRpg==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-jshint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", - "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.7.tgz", + "integrity": "sha512-qHA8rmwUnLiIxANJbz650+NVzqDIwNtc0TcpIa0+uekbmKHttidvQ1dGximU3vEDdoJVKFgR3TXFqYuZmYy9ZQ==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -4366,24 +3563,24 @@ } }, "conventional-changelog-preset-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", - "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, "conventional-changelog-writer": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", - "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz", + "integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==", "dev": true, "requires": { "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", + "conventional-commits-filter": "^2.0.6", "dateformat": "^3.0.0", - "handlebars": "^4.4.0", + "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "semver": "^6.0.0", "split": "^1.0.0", "through2": "^3.0.0" @@ -4404,9 +3601,9 @@ "dev": true }, "conventional-commits-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", - "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", + "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -4414,27 +3611,35 @@ } }, "conventional-commits-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", - "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", + "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "split2": "^2.0.0", "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" } }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "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==", + "dev": true + } } }, "copy-descriptor": { @@ -4444,10 +3649,11 @@ "dev": true }, "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", - "dev": true + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4468,16 +3674,6 @@ "parse-json": "^4.0.0" }, "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "optional": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -4509,38 +3705,12 @@ } } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "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==", "dev": true }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -4551,9 +3721,9 @@ } }, "cz-conventional-changelog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.1.0.tgz", - "integrity": "sha512-SCwPPOF+7qMh1DZkJhrwaxCvZzPaz2E9BwQzcZwBuHlpcJj9zzz7K5vADQRhHuxStaHZFSLbDlZEdcls4bKu7Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz", + "integrity": "sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==", "dev": true, "requires": { "@commitlint/load": ">6.1.1", @@ -4562,26 +3732,9 @@ "conventional-commit-types": "^3.0.0", "lodash.map": "^4.5.1", "longest": "^2.0.1", - "right-pad": "^1.0.1", "word-wrap": "^1.0.3" } }, - "cz-emoji": { - "version": "github:amejiarosario/cz-emoji#c7518f2b6ed3368dd60a37c1a4abbfff041549c0", - "from": "github:amejiarosario/cz-emoji", - "dev": true, - "requires": { - "cli-truncate": "^1.0.0", - "fuse.js": "^3.4.5", - "home-dir": "^1.0.0", - "inquirer-autocomplete-prompt": "^0.12.0", - "inquirer-maxlength-input-prompt": "^1.0.0", - "pad": "^2.3.0", - "prettier": "^1.18.2", - "read-pkg-up": "^2.0.0", - "wrap-ansi": "^3.0.0" - } - }, "dargs": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", @@ -4601,25 +3754,31 @@ } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" }, "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" } } } @@ -4630,15 +3789,6 @@ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -4663,6 +3813,12 @@ } } }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -4693,35 +3849,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4775,12 +3902,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -4802,31 +3923,10 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", + "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", "dev": true }, "dir-glob": { @@ -4856,12 +3956,20 @@ } }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } } }, "dot-prop": { @@ -4880,6 +3988,38 @@ "dev": true, "requires": { "readable-stream": "^2.0.2" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { @@ -4918,9 +4058,9 @@ }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -4929,9 +4069,9 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -4990,27 +4130,6 @@ "mimic-fn": "^2.1.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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5076,43 +4195,76 @@ "dev": true }, "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { - "esprima": "^3.1.3", + "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } } } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.0.0.tgz", + "integrity": "sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "espree": "^7.0.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -5125,47 +4277,95 @@ "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", + "levn": "^0.4.1", "lodash": "^4.17.14", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.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==", + "dev": true, + "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==", "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { - "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==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -5177,6 +4377,26 @@ "ms": "^2.1.1" } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -5186,13 +4406,43 @@ "is-glob": "^4.0.1" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "is-extglob": { @@ -5201,6 +4451,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "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==", + "dev": true + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -5210,46 +4466,92 @@ "is-extglob": "^2.1.1" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "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==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "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==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "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==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -5375,9 +4677,9 @@ } }, "eslint-plugin-jest": { - "version": "23.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", - "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "version": "23.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.11.0.tgz", + "integrity": "sha512-qedvh6mcMgoLFHjITtG40yKOCu5Fa1GMYesDOclU30ZvtVkf+DaH0fnCn1ysOX/QMdk2SGhQvxvYLowcLaM0GA==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -5394,9 +4696,9 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -5409,9 +4711,9 @@ "dev": true }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", "dev": true, "requires": { "acorn": "^7.1.1", @@ -5420,9 +4722,9 @@ }, "dependencies": { "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true } } @@ -5434,18 +4736,18 @@ "dev": true }, "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^5.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } @@ -5471,15 +4773,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -5507,6 +4800,27 @@ "shebang-command": "^1.2.0", "which": "^1.2.9" } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true } } }, @@ -5516,48 +4830,6 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -5568,17 +4840,17 @@ } }, "expect": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", - "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.0.1.tgz", + "integrity": "sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^26.0.1", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", - "jest-regex-util": "^25.2.6" + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0" }, "dependencies": { "ansi-styles": { @@ -5607,9 +4879,9 @@ "dev": true }, "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true } } @@ -5641,26 +4913,6 @@ } } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -5724,9 +4976,9 @@ } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "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==", "dev": true }, "fast-levenshtein": { @@ -5736,21 +4988,21 @@ "dev": true }, "fastq": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", - "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { - "bser": "^2.0.0" + "bser": "2.1.1" } }, "figures": { @@ -5771,29 +5023,6 @@ "flat-cache": "^2.0.1" } }, - "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==", - "dev": true, - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6120,12 +5349,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -6188,15 +5411,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6231,6 +5445,38 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs-extra": { @@ -6250,423 +5496,421 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "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==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", "dev": true, - "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { + "camelcase": { "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true }, - "aproba": { - "version": "1.2.0", - "bundled": true, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, - "optional": true + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, - "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "repeating": "^2.0.0" } }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, - "optional": true + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, - "optional": true + "requires": { + "pinkie-promise": "^2.0.0" + } }, - "debug": { - "version": "3.2.6", - "bundled": true, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, - "optional": true, "requires": { - "ms": "^2.1.1" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, + "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==", "dev": true, - "optional": true + "requires": { + "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" + } }, - "delegates": { + "redent": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, - "optional": true + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "minipass": "^2.6.0" + "safe-buffer": "~5.1.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, - "optional": true + "requires": { + "get-stdin": "^4.0.1" + } }, - "gauge": { - "version": "2.7.4", - "bundled": true, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "glob": { - "version": "7.1.6", - "bundled": true, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "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==", "dev": true, - "optional": true, "requires": { - "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" + "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" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "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==", + "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", "dev": true, - "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "through2": "~2.0.0" } }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, + "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==", "dev": true, - "optional": true, "requires": { - "minimatch": "^3.0.4" + "safe-buffer": "~5.1.0" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } + } + } + }, + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, - "optional": true, "requires": { - "minimist": "^1.2.5" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", "dev": true, - "optional": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, - "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "pify": "^3.0.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "readable-stream": { "version": "2.3.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6677,945 +5921,991 @@ "util-deprecate": "~1.0.1" } }, - "rimraf": { - "version": "2.7.1", - "bundled": true, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, - "optional": true, "requires": { - "glob": "^7.1.3" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } }, "safe-buffer": { "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "git-semver-tags": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.0.0.tgz", + "integrity": "sha512-LajaAWLYVBff+1NVircURJFL8TQ3EMIcLAfHisWYX/nPoMwnTYfWAznQDmMujlLqoD12VtLmoSrF1sQ5MhimEQ==", + "dev": true, + "requires": { + "meow": "^7.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "dev": true + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } }, - "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==", - "dev": true + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "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" + } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4" + } }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" }, "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "globby": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true } } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "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==", "dev": true, "requires": { - "pump": "^3.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "function-bind": "^1.1.1" } }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "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=", "dev": true, "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "parse-json": { + "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "is-buffer": "^1.1.5" } } } }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - } - }, - "git-semver-tags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz", - "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "meow": "^5.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "parse-passwd": "^1.0.0" } }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "^1.3.2" - } + "hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "dev": true, - "requires": { - "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" - } + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "whatwg-encoding": "^1.0.5" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, - "optional": true, "requires": { - "ini": "^1.3.4" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, - "globby": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", - "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" }, "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "safer-buffer": ">= 2.1.2 < 3" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "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==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "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==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "resolve-from": "^5.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true - } - } - }, - "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=", - "dev": true, - "requires": { - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } } } }, - "home-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-dir/-/home-dir-1.0.0.tgz", - "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=", + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "into-stream": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", + "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "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=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "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==", "dev": true }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "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=", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "kind-of": "^3.0.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "ms": "^2.1.1" + "is-buffer": "^1.1.5" } } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "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==", + "dev": true } } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "optional": true + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "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=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "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=", + "dev": true + }, + "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==", "dev": true, "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "isobject": "^3.0.1" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "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==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, + "java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true + }, + "jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.1.tgz", + "integrity": "sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==", + "dev": true, + "requires": { + "@jest/core": "^26.0.1", + "import-local": "^3.0.2", + "jest-cli": "^26.0.1" + }, + "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==", "dev": true, "requires": { @@ -7624,9 +6914,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7654,19 +6944,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -7677,12 +6954,58 @@ "path-exists": "^4.0.0" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "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==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "jest-cli": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.0.1.tgz", + "integrity": "sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==", + "dev": true, + "requires": { + "@jest/core": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "prompts": "^2.0.1", + "yargs": "^15.3.1" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7693,9 +7016,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -7716,30 +7039,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, "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==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -7749,11 +7054,14 @@ "find-up": "^4.0.0" } }, - "slash": { + "resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } }, "supports-color": { "version": "7.1.0", @@ -7766,136 +7074,133 @@ } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "jest-changed-files": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.0.1.tgz", + "integrity": "sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==", "dev": true, "requires": { - "resolve-from": "^5.0.0" + "@jest/types": "^26.0.1", + "execa": "^4.0.0", + "throat": "^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==", - "dev": true - } - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "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==", + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "ansi-regex": { + "execa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "throat": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.0.1.tgz", + "integrity": "sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.0.1", + "@jest/types": "^26.0.1", + "babel-jest": "^26.0.1", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.0.1", + "jest-environment-node": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-jasmine2": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "micromatch": "^4.0.2", + "pretty-format": "^26.0.1" + }, + "dependencies": { "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -7907,30 +7212,15 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7946,25 +7236,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -7972,70 +7248,20 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "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==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "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==", - "dev": true, - "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==", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "supports-color": { @@ -8046,990 +7272,840 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true } } }, - "inquirer-autocomplete-prompt": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz", - "integrity": "sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw==", + "jest-diff": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.0.1.tgz", + "integrity": "sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "figures": "^2.0.0", - "inquirer": "3.2.0", - "run-async": "^2.3.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.0.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" }, "dependencies": { - "inquirer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz", - "integrity": "sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew==", + "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==", "dev": true, "requires": { - "ansi-escapes": "^2.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } - } - } - }, - "inquirer-maxlength-input-prompt": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.0.tgz", - "integrity": "sha512-MdwZJKv2Z3dWABPDjSt69AX09y36nn8sMW3v4T7kZ6Fj/36PT3LfsM1m6dK7dg+2D6e1t7SjW/C1t9bP1cq5dQ==", - "dev": true, - "requires": { - "chalk": "^2.3.1", - "inquirer": "^5.1.0", - "jest": "^22.4.2", - "lodash.invoke": "^4.5.2", - "lodash.isfunction": "^3.0.9", - "lodash.partialright": "^4.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true }, - "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==", + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "babel-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", - "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "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==", "dev": true, "requires": { - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.4" + "color-name": "~1.1.4" } }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "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==", "dev": true }, - "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^22.4.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.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==", + "dev": true }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" + "has-flag": "^4.0.0" } - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + }, + "dependencies": { + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + } + } + }, + "jest-each": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.0.1.tgz", + "integrity": "sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1" + }, + "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==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", - "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^22.4.4" - }, - "dependencies": { - "jest-cli": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", - "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.14", - "istanbul-lib-coverage": "^1.1.1", - "istanbul-lib-instrument": "^1.8.0", - "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.2.0", - "jest-config": "^22.4.4", - "jest-environment-jsdom": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^22.4.2", - "jest-message-util": "^22.4.0", - "jest-regex-util": "^22.1.0", - "jest-resolve-dependencies": "^22.1.0", - "jest-runner": "^22.4.4", - "jest-runtime": "^22.4.4", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "jest-worker": "^22.2.2", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^10.0.3" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "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==", "dev": true, "requires": { - "throat": "^4.0.0" + "color-name": "~1.1.4" } }, - "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" - } + "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==", + "dev": true }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", - "jsdom": "^11.5.1" + "has-flag": "^4.0.0" } + } + } + }, + "jest-environment-jsdom": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz", + "integrity": "sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==", + "dev": true, + "requires": { + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1", + "jsdom": "^16.2.2" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", - "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" - } + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true }, - "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^22.4.3", - "jest-serializer": "^22.4.3", - "jest-worker": "^22.4.3", - "micromatch": "^2.3.11", - "sane": "^2.0.0" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } } }, - "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", - "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" + "jsdom": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", + "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.0.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" } }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "whatwg-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", "dev": true, "requires": { - "pretty-format": "^22.4.3" + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } } }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.0.1.tgz", + "integrity": "sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==", + "dev": true, + "requires": { + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" + } + }, + "jest-haste-map": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.0.1.tgz", + "integrity": "sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-serializer": "^26.0.0", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "dependencies": { + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" - } - }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "jest-regex-util": "^22.4.3" + "rsvp": "^4.8.4" } }, - "jest-runner": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", - "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "exit": "^0.1.2", - "jest-config": "^22.4.4", - "jest-docblock": "^22.4.0", - "jest-haste-map": "^22.4.2", - "jest-jasmine2": "^22.4.4", - "jest-leak-detector": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-runtime": "^22.4.4", - "jest-util": "^22.4.1", - "jest-worker": "^22.2.2", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", - "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^22.4.4", - "babel-plugin-istanbul": "^4.1.5", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^22.4.4", - "jest-haste-map": "^22.4.2", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^10.0.3" + "ms": "2.0.0" } }, - "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" - } - }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0" + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } } }, - "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-config": "^22.4.4", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^22.4.0" + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "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==", "dev": true, "requires": { - "merge-stream": "^1.0.1" + "kind-of": "^6.0.0" } }, - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "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==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "kind-of": "^6.0.0" } }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "into-stream": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", - "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "dependencies": { - "p-is-promise": { + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true - } - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "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==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "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=", + "jest-jasmine2": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz", + "integrity": "sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.0.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.0.1", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1", + "throat": "^5.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + } } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "jest-leak-detector": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz", + "integrity": "sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" }, "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==", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "optional": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "jest-matcher-utils": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz", + "integrity": "sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==", "dev": true, "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.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=", - "dev": true - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "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=", - "dev": true - }, - "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==", - "dev": true, - "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=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "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==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "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==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true - }, - "jest": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", - "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", - "dev": true, - "requires": { - "@jest/core": "^25.2.7", - "import-local": "^3.0.2", - "jest-cli": "^25.2.7" + "chalk": "^4.0.0", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" }, "dependencies": { "ansi-styles": { @@ -9043,21 +8119,15 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9073,295 +8143,43 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.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==", "dev": true }, - "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==", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "jest-cli": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", - "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", - "dev": true, - "requires": { - "@jest/core": "^25.2.7", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", - "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.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==", - "dev": true, - "requires": { - "p-limit": "^2.2.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==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", - "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", - "dev": true, - "requires": { - "@jest/types": "^25.2.6", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "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", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } } } }, - "jest-config": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", - "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", + "jest-message-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.0.1.tgz", + "integrity": "sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.2.7", - "@jest/types": "^25.2.6", - "babel-jest": "^25.2.6", - "chalk": "^3.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.2.6", - "jest-environment-node": "^25.2.6", - "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.2.7", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", - "pretty-format": "^25.2.6", - "realpath-native": "^2.0.0" + "slash": "^3.0.0", + "stack-utils": "^2.0.2" }, "dependencies": { "ansi-styles": { @@ -9375,9 +8193,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9399,18 +8217,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -9421,10 +8239,10 @@ "picomatch": "^2.0.5" } }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "supports-color": { @@ -9438,16 +8256,41 @@ } } }, - "jest-diff": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", - "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "jest-mock": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.0.1.tgz", + "integrity": "sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.0.1.tgz", + "integrity": "sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "jest-util": "^26.0.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -9461,9 +8304,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9485,17 +8328,124 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "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": { + "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==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "supports-color": { "version": "7.1.0", @@ -9505,37 +8455,51 @@ "requires": { "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==", + "dev": true } } }, - "jest-docblock": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", - "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", + "jest-resolve-dependencies": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz", + "integrity": "sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==", "dev": true, "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - } + "@jest/types": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.0.1" } }, - "jest-each": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", - "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", + "jest-runner": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.0.1.tgz", + "integrity": "sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "jest-util": "^25.2.6", - "pretty-format": "^25.2.6" + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.0.1", + "jest-jasmine2": "^26.0.1", + "jest-leak-detector": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" }, "dependencies": { "ansi-styles": { @@ -9549,9 +8513,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9573,18 +8537,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -9593,617 +8557,327 @@ "requires": { "has-flag": "^4.0.0" } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true } } }, - "jest-environment-jsdom": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", - "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", - "dev": true, - "requires": { - "@jest/environment": "^25.2.6", - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", - "jsdom": "^15.2.1" + "jest-runtime": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.0.1.tgz", + "integrity": "sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==", + "dev": true, + "requires": { + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/globals": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" }, "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "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==", "dev": true }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "whatwg-url": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "has-flag": "^4.0.0" } - }, - "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true } } }, - "jest-environment-node": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", - "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", + "jest-serializer": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.0.0.tgz", + "integrity": "sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==", "dev": true, "requires": { - "@jest/environment": "^25.2.6", - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", - "semver": "^6.3.0" + "graceful-fs": "^4.2.4" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true } } }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-haste-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", - "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", + "jest-snapshot": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.0.1.tgz", + "integrity": "sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "@babel/types": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.0.1", + "semver": "^7.3.2" }, "dependencies": { - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "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==", "dev": true, "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "arr-diff": { + "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==", + "dev": true, + "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==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "rsvp": "^4.8.4" + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.0.1.tgz", + "integrity": "sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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==", "dev": true, "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } + "color-name": "~1.1.4" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "ci-info": "^2.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } } } }, - "jest-jasmine2": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", - "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", + "jest-validate": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.0.1.tgz", + "integrity": "sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.2.6", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.2.7", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", - "jest-runtime": "^25.2.7", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "pretty-format": "^25.2.6", - "throat": "^5.0.0" + "@jest/types": "^26.0.1", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "leven": "^3.1.0", + "pretty-format": "^26.0.1" }, "dependencies": { "ansi-styles": { @@ -10217,9 +8891,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10247,10 +8921,16 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, + "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==", "dev": true }, "supports-color": { @@ -10261,45 +8941,38 @@ "requires": { "has-flag": "^4.0.0" } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true } } }, - "jest-leak-detector": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", - "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", + "jest-watcher": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.0.1.tgz", + "integrity": "sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==", "dev": true, "requires": { - "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.0.1", + "string-length": "^4.0.1" }, "dependencies": { - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true - } - } - }, - "jest-matcher-utils": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", - "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" - }, - "dependencies": { + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -10311,9 +8984,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10341,11 +9014,24 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "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==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } }, "supports-color": { "version": "7.1.0", @@ -10355,79 +9041,35 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true } } }, - "jest-message-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", - "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.2.6", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" + "merge-stream": "^2.0.0", + "supports-color": "^7.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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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==", "dev": true }, "supports-color": { @@ -10441,150 +9083,337 @@ } } }, - "jest-mock": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", - "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "@jest/types": "^25.2.6" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "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==", "dev": true }, - "jest-resolve": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", - "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - }, - "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "graceful-fs": "^4.1.6" } }, - "jest-resolve-dependencies": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", - "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.2.7" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "jest-runner": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", - "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/environment": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.2.7", - "jest-docblock": "^25.2.6", - "jest-haste-map": "^25.2.6", - "jest-jasmine2": "^25.2.7", - "jest-leak-detector": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-runtime": "^25.2.7", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", - "source-map-support": "^0.5.6", - "throat": "^5.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==", + "prelude-ls": "^1.2.1", + "type-check": "~0.4.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=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", + "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==", + "dev": true + }, + "marked-terminal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz", + "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "cardinal": "^2.1.1", + "chalk": "^4.0.0", + "cli-table": "^0.3.1", + "node-emoji": "^1.10.0", + "supports-hyperlinks": "^2.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "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==", "dev": true, "requires": { "@types/color-name": "^1.1.1", @@ -10592,9 +9421,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10622,16 +9451,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -10641,1655 +9460,930 @@ "has-flag": "^4.0.0" } }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true } } }, - "jest-runtime": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", - "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", + "mem": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.0.tgz", + "integrity": "sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/environment": "^25.2.6", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.2.7", - "jest-haste-map": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, - "slash": { + "mimic-fn": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", + "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true - }, - "jest-snapshot": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", - "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", "dev": true, "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.2.6", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.2.7", - "jest-diff": "^25.2.6", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.2.6", - "semver": "^6.3.0" + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" }, "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.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==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "color-name": "~1.1.4" + "p-locate": "^4.1.0" } }, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", - "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", - "dev": true, - "requires": { - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "make-dir": "^3.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==", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "p-try": "^2.0.0" } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "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==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-limit": "^2.2.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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==", "dev": true }, - "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==", + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "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==", - "dev": true - }, - "has-flag": { + "path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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==", + "dev": true + } } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } } } }, - "jest-validate": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", - "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "leven": "^3.1.0", - "pretty-format": "^25.2.6" - }, - "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.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==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "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==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "mime-db": "1.44.0" } }, - "jest-watcher": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", - "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", + "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==", + "dev": true + }, + "min-indent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", + "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.2.6", - "string-length": "^3.1.0" + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz", + "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" }, "dependencies": { - "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==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.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==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true } } }, - "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "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==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "is-plain-object": "^2.0.4" } } } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "minimist": "^1.2.5" } }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "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==", + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "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==", + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "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=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + } + } }, - "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=", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", "dev": true }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "lodash.toarray": "^4.4.0" } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "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==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "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=", + "normalize-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.0.0.tgz", + "integrity": "sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw==", "dev": true }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "npm": { + "version": "6.14.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.5.tgz", + "integrity": "sha512-CDwa3FJd0XJpKDbWCST484H+mCNjF26dPrU+xnREW+upR0UODjMEfXPl3bxWuAwZIX6c2ASg1plLO7jP8ehWeA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.7", + "bluebird": "^3.5.5", + "byte-size": "^5.0.1", + "cacache": "^12.0.3", + "call-limit": "^1.1.1", + "chownr": "^1.1.4", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "^3.0.3", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.3.0", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.8.8", + "iferr": "^1.0.2", + "imurmurhash": "*", + "infer-owner": "^1.0.4", + "inflight": "~1.0.6", + "inherits": "^2.0.4", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^4.0.7", + "libnpm": "^3.0.1", + "libnpmaccess": "^3.0.2", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "libnpx": "^10.2.2", + "lock-verify": "^2.1.0", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^5.1.1", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.5", + "move-concurrently": "^1.0.1", + "node-gyp": "^5.1.0", + "nopt": "^4.0.3", + "normalize-package-data": "^2.5.0", + "npm-audit-report": "^1.3.2", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "^3.0.2", + "npm-lifecycle": "^3.1.4", + "npm-package-arg": "^6.1.1", + "npm-packlist": "^1.4.8", + "npm-pick-manifest": "^3.0.2", + "npm-profile": "^4.0.4", + "npm-registry-fetch": "^4.0.4", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.1", + "osenv": "^0.1.5", + "pacote": "^9.5.12", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.8.2", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "^1.0.5", + "read-installed": "~4.0.3", + "read-package-json": "^2.1.1", + "read-package-tree": "^5.3.1", + "readable-stream": "^3.6.0", + "readdir-scoped-modules": "^1.1.0", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.7.1", + "safe-buffer": "^5.1.2", + "semver": "^5.7.1", + "sha": "^3.0.0", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.1", + "tar": "^4.4.13", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.3", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.7.0", + "write-file-atomic": "^2.4.3" }, "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "JSONStream": { + "version": "1.3.5", + "bundled": true, "dev": true, "requires": { - "is-utf8": "^0.2.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.invoke": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.invoke/-/lodash.invoke-4.5.2.tgz", - "integrity": "sha1-AcoH5HCQOv+j/+x60u0icj0vaXw=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.partialright": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "macos-release": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", - "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", - "dev": true - }, - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", - "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", - "dev": true - }, - "marked-terminal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.0.0.tgz", - "integrity": "sha512-mzU3VD7aVz12FfGoKFAceijehA6Ocjfg3rVimvJbFAB/NOYCsuzRVtq3PSFdPmWI5mhdGeEh3/aMJ5DSxAz94Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^3.0.0", - "cli-table": "^0.3.1", - "node-emoji": "^1.10.0", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "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==", + }, + "agent-base": { + "version": "4.3.0", + "bundled": true, "dev": true, "requires": { - "type-fest": "^0.11.0" + "es6-promisify": "^5.0.0" } }, - "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==", + "agentkeepalive": { + "version": "3.5.2", + "bundled": true, "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "humanize-ms": "^1.2.1" } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "ajv": { + "version": "5.5.2", + "bundled": true, "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.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==", + "ansi-align": { + "version": "2.0.0", + "bundled": true, "dev": true, "requires": { - "color-name": "~1.1.4" + "string-width": "^2.0.0" } }, - "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==", + "ansi-regex": { + "version": "2.1.1", + "bundled": true, "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, "dev": true }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, "dev": true, "requires": { - "has-flag": "^4.0.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "mem": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-6.0.1.tgz", - "integrity": "sha512-uIRYASflIsXqvKe+7aXbLrydaRzz4qiK6amqZDQI++eRtW3UoKtnDcGeCAOREgll7YMxO5E4VB9+3B0LFmy96g==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", - "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==", + "asap": { + "version": "2.0.6", + "bundled": true, "dev": true - } - } - }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + }, + "asn1": { + "version": "0.2.4", + "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "safer-buffer": "~2.1.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "tweetnacl": "^0.14.3" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "bin-links": { + "version": "1.1.7", + "bundled": true, "dev": true, "requires": { - "pify": "^3.0.0" + "bluebird": "^3.5.3", + "cmd-shim": "^3.0.0", + "gentle-fs": "^2.3.0", + "graceful-fs": "^4.1.15", + "npm-normalize-package-bin": "^1.0.0", + "write-file-atomic": "^2.3.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "bluebird": { + "version": "3.5.5", + "bundled": true, "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "boxen": { + "version": "1.3.0", + "bundled": true, "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "12.0.3", + "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.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" } - } - } - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + }, + "call-limit": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } - } - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "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==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.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==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "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==", + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "ip-regex": "^2.1.0" } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "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.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=", + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "cmd-shim": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true, "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.0.0.tgz", - "integrity": "sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw==", - "dev": true - }, - "npm": { - "version": "6.14.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz", - "integrity": "sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==", - "dev": true, - "requires": { - "JSONStream": "^1.3.5", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "^2.0.0", - "archy": "~1.0.0", - "bin-links": "^1.1.7", - "bluebird": "^3.5.5", - "byte-size": "^5.0.1", - "cacache": "^12.0.3", - "call-limit": "^1.1.1", - "chownr": "^1.1.4", - "ci-info": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.1", - "cmd-shim": "^3.0.3", - "columnify": "~1.5.4", - "config-chain": "^1.1.12", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.3.0", - "glob": "^7.1.6", - "graceful-fs": "^4.2.3", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.8", - "iferr": "^1.0.2", - "imurmurhash": "*", - "infer-owner": "^1.0.4", - "inflight": "~1.0.6", - "inherits": "^2.0.4", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^3.0.0", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^4.0.7", - "libnpm": "^3.0.1", - "libnpmaccess": "^3.0.2", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "libnpx": "^10.2.2", - "lock-verify": "^2.1.0", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^5.1.1", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.4", - "move-concurrently": "^1.0.1", - "node-gyp": "^5.1.0", - "nopt": "~4.0.1", - "normalize-package-data": "^2.5.0", - "npm-audit-report": "^1.3.2", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "^3.0.2", - "npm-lifecycle": "^3.1.4", - "npm-package-arg": "^6.1.1", - "npm-packlist": "^1.4.8", - "npm-pick-manifest": "^3.0.2", - "npm-profile": "^4.0.4", - "npm-registry-fetch": "^4.0.3", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.1", - "osenv": "^0.1.5", - "pacote": "^9.5.12", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.8.2", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "^1.0.5", - "read-installed": "~4.0.3", - "read-package-json": "^2.1.1", - "read-package-tree": "^5.3.1", - "readable-stream": "^3.6.0", - "readdir-scoped-modules": "^1.1.0", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "^2.7.1", - "safe-buffer": "^5.1.2", - "semver": "^5.7.1", - "sha": "^3.0.0", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.1", - "stringify-package": "^1.0.1", - "tar": "^4.4.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "^1.1.1", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.3", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.7.0", - "write-file-atomic": "^2.4.3" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } }, - "abbrev": { - "version": "1.1.1", + "code-point-at": { + "version": "1.1.0", "bundled": true, "dev": true }, - "agent-base": { - "version": "4.3.0", + "color-convert": { + "version": "1.9.1", "bundled": true, "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "color-name": "^1.1.1" } }, - "agentkeepalive": { - "version": "3.5.2", + "color-name": { + "version": "1.1.3", "bundled": true, - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } + "dev": true }, - "ajv": { - "version": "5.5.2", + "colors": { + "version": "1.3.3", "bundled": true, "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } + "optional": true }, - "ansi-align": { - "version": "2.0.0", + "columnify": { + "version": "1.5.4", "bundled": true, "dev": true, "requires": { - "string-width": "^2.0.0" + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" } }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", + "combined-stream": { + "version": "1.0.6", "bundled": true, "dev": true, "requires": { - "color-convert": "^1.9.0" + "delayed-stream": "~1.0.0" } }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", + "concat-map": { + "version": "0.0.1", "bundled": true, "dev": true }, - "are-we-there-yet": { - "version": "1.1.4", + "concat-stream": { + "version": "1.6.2", "bundled": true, "dev": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "readable-stream": { @@ -12316,307 +10410,403 @@ } } }, - "asap": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "asn1": { - "version": "0.2.4", + "config-chain": { + "version": "1.1.12", "bundled": true, "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", + "configstore": { + "version": "3.1.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } }, - "aws-sign2": { - "version": "0.7.0", + "console-control-strings": { + "version": "1.1.0", "bundled": true, "dev": true }, - "aws4": { - "version": "1.8.0", + "copy-concurrently": { + "version": "1.0.5", "bundled": true, - "dev": true + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } }, - "balanced-match": { - "version": "1.0.0", + "core-util-is": { + "version": "1.0.2", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", + "create-error-class": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "capture-stack-trace": "^1.0.0" } }, - "bin-links": { - "version": "1.1.7", + "cross-spawn": { + "version": "5.1.0", "bundled": true, "dev": true, "requires": { - "bluebird": "^3.5.3", - "cmd-shim": "^3.0.0", - "gentle-fs": "^2.3.0", - "graceful-fs": "^4.1.15", - "npm-normalize-package-bin": "^1.0.0", - "write-file-atomic": "^2.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + } } }, - "bluebird": { - "version": "3.5.5", + "crypto-random-string": { + "version": "1.0.0", "bundled": true, "dev": true }, - "boxen": { - "version": "1.3.0", + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", "bundled": true, "dev": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "assert-plus": "^1.0.0" } }, - "brace-expansion": { - "version": "1.1.11", + "debug": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } } }, - "buffer-from": { - "version": "1.0.0", + "debuglog": { + "version": "1.0.1", "bundled": true, "dev": true }, - "builtins": { - "version": "1.0.3", + "decamelize": { + "version": "1.2.0", "bundled": true, "dev": true }, - "byline": { - "version": "5.0.0", + "decode-uri-component": { + "version": "0.2.0", "bundled": true, "dev": true }, - "byte-size": { - "version": "5.0.1", + "deep-extend": { + "version": "0.6.0", "bundled": true, "dev": true }, - "cacache": { - "version": "12.0.3", + "defaults": { + "version": "1.0.3", "bundled": true, "dev": true, "requires": { - "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" + "clone": "^1.0.2" } }, - "call-limit": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", + "define-properties": { + "version": "1.1.3", "bundled": true, - "dev": true + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } }, - "capture-stack-trace": { + "delayed-stream": { "version": "1.0.0", "bundled": true, "dev": true }, - "caseless": { - "version": "0.12.0", + "delegates": { + "version": "1.0.0", "bundled": true, "dev": true }, - "chalk": { - "version": "2.4.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.1.4", + "detect-indent": { + "version": "5.0.0", "bundled": true, "dev": true }, - "ci-info": { - "version": "2.0.0", + "detect-newline": { + "version": "2.1.0", "bundled": true, "dev": true }, - "cidr-regex": { - "version": "2.0.10", + "dezalgo": { + "version": "1.0.3", "bundled": true, "dev": true, "requires": { - "ip-regex": "^2.1.0" + "asap": "^2.0.0", + "wrappy": "1" } }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "3.1.2", + "dot-prop": { + "version": "4.2.0", "bundled": true, "dev": true, "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" + "is-obj": "^1.0.0" } }, - "cli-table3": { - "version": "0.5.1", + "dotenv": { + "version": "5.0.1", "bundled": true, - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } + "dev": true }, - "cliui": { - "version": "4.1.0", + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", "bundled": true, "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", + "readable-stream": { + "version": "2.3.6", "bundled": true, - "dev": true + "dev": true, + "requires": { + "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" + } }, - "strip-ansi": { - "version": "4.0.0", + "string_decoder": { + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "safe-buffer": "~5.1.0" } } } }, - "clone": { - "version": "1.0.4", + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", "bundled": true, "dev": true }, - "cmd-shim": { - "version": "3.0.3", + "encoding": { + "version": "0.1.12", "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "iconv-lite": "~0.4.13" } }, - "co": { - "version": "4.6.0", + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.0", "bundled": true, "dev": true }, - "code-point-at": { - "version": "1.1.0", + "err-code": { + "version": "1.1.2", "bundled": true, "dev": true }, - "color-convert": { - "version": "1.9.1", + "errno": { + "version": "0.1.7", "bundled": true, "dev": true, "requires": { - "color-name": "^1.1.1" + "prr": "~1.0.1" } }, - "color-name": { - "version": "1.1.3", + "es-abstract": { + "version": "1.12.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } }, - "colors": { - "version": "1.3.3", + "es-to-primitive": { + "version": "1.2.0", "bundled": true, "dev": true, - "optional": true + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } }, - "columnify": { - "version": "1.5.4", + "es6-promise": { + "version": "4.2.8", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", "bundled": true, "dev": true, "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" + "es6-promise": "^4.0.3" } }, - "combined-stream": { - "version": "1.0.6", + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", "bundled": true, "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } } }, - "concat-map": { - "version": "0.0.1", + "extend": { + "version": "3.0.2", "bundled": true, "dev": true }, - "concat-stream": { - "version": "1.6.2", + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", "bundled": true, "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" }, "dependencies": { "readable-stream": { @@ -12643,1423 +10833,1460 @@ } } }, - "config-chain": { - "version": "1.1.12", + "forever-agent": { + "version": "0.6.1", "bundled": true, - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } + "dev": true }, - "configstore": { - "version": "3.1.2", + "form-data": { + "version": "2.3.2", "bundled": true, "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", + "from2": { + "version": "2.3.0", "bundled": true, "dev": true, "requires": { - "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" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" }, "dependencies": { - "aproba": { - "version": "1.2.0", + "readable-stream": { + "version": "2.3.6", "bundled": true, - "dev": true + "dev": true, + "requires": { + "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" + } }, - "iferr": { - "version": "0.1.5", + "string_decoder": { + "version": "1.1.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", + "fs-minipass": { + "version": "1.2.7", "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "minipass": "^2.6.0" }, "dependencies": { - "lru-cache": { - "version": "4.1.5", + "minipass": { + "version": "2.9.0", "bundled": true, "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } - }, - "yallist": { - "version": "2.1.2", + } + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", "bundled": true, "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "crypto-random-string": { + "fs.realpath": { "version": "1.0.0", "bundled": true, "dev": true }, - "cyclist": { - "version": "0.2.2", + "function-bind": { + "version": "1.1.1", "bundled": true, "dev": true }, - "dashdash": { - "version": "1.14.1", + "gauge": { + "version": "2.7.4", "bundled": true, "dev": true, "requires": { - "assert-plus": "^1.0.0" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, - "debug": { - "version": "3.1.0", + "genfun": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.3.0", "bundled": true, "dev": true, "requires": { - "ms": "2.0.0" + "aproba": "^1.1.2", + "chownr": "^1.1.2", + "cmd-shim": "^3.0.3", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "infer-owner": "^1.0.4", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" }, "dependencies": { - "ms": { - "version": "2.0.0", + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", "bundled": true, "dev": true } } }, - "debuglog": { - "version": "1.0.1", + "get-caller-file": { + "version": "1.0.3", "bundled": true, "dev": true }, - "decamelize": { - "version": "1.2.0", + "get-stream": { + "version": "4.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, - "decode-uri-component": { - "version": "0.2.0", + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", "bundled": true, "dev": true }, - "deep-extend": { - "version": "0.6.0", + "har-schema": { + "version": "2.0.0", "bundled": true, "dev": true }, - "defaults": { - "version": "1.0.3", + "har-validator": { + "version": "5.1.0", "bundled": true, "dev": true, "requires": { - "clone": "^1.0.2" + "ajv": "^5.3.0", + "har-schema": "^2.0.0" } }, - "define-properties": { - "version": "1.1.3", + "has": { + "version": "1.0.3", "bundled": true, "dev": true, "requires": { - "object-keys": "^1.0.12" + "function-bind": "^1.1.1" } }, - "delayed-stream": { - "version": "1.0.0", + "has-flag": { + "version": "3.0.0", "bundled": true, "dev": true }, - "delegates": { + "has-symbols": { "version": "1.0.0", "bundled": true, "dev": true }, - "detect-indent": { - "version": "5.0.0", + "has-unicode": { + "version": "2.0.1", "bundled": true, "dev": true }, - "detect-newline": { - "version": "2.1.0", + "hosted-git-info": { + "version": "2.8.8", "bundled": true, "dev": true }, - "dezalgo": { - "version": "1.0.3", + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", "bundled": true, "dev": true, "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "agent-base": "4", + "debug": "3.1.0" } }, - "dot-prop": { - "version": "4.2.0", + "http-signature": { + "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "is-obj": "^1.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "dotenv": { - "version": "5.0.1", + "https-proxy-agent": { + "version": "2.2.4", "bundled": true, - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true, - "dev": true + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } }, - "duplexify": { - "version": "3.6.0", + "humanize-ms": { + "version": "1.2.1", "bundled": true, "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "ms": "^2.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", + "iconv-lite": { + "version": "0.4.23", "bundled": true, "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "editor": { - "version": "1.0.0", + "iferr": { + "version": "1.0.2", "bundled": true, "dev": true }, - "encoding": { - "version": "0.1.12", + "ignore-walk": { + "version": "3.0.3", "bundled": true, "dev": true, "requires": { - "iconv-lite": "~0.4.13" + "minimatch": "^3.0.4" } }, - "end-of-stream": { - "version": "1.4.1", + "import-lazy": { + "version": "2.1.0", "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } + "dev": true }, - "env-paths": { - "version": "2.2.0", + "imurmurhash": { + "version": "0.1.4", "bundled": true, "dev": true }, - "err-code": { - "version": "1.1.2", + "infer-owner": { + "version": "1.0.4", "bundled": true, "dev": true }, - "errno": { - "version": "0.1.7", + "inflight": { + "version": "1.0.6", "bundled": true, "dev": true, "requires": { - "prr": "~1.0.1" + "once": "^1.3.0", + "wrappy": "1" } }, - "es-abstract": { - "version": "1.12.0", + "inherits": { + "version": "2.0.4", "bundled": true, - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } + "dev": true }, - "es-to-primitive": { - "version": "1.2.0", + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", "bundled": true, "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" } }, - "es6-promise": { - "version": "4.2.8", + "invert-kv": { + "version": "2.0.0", "bundled": true, "dev": true }, - "es6-promisify": { - "version": "5.0.0", + "ip": { + "version": "1.1.5", "bundled": true, - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } + "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", + "ip-regex": { + "version": "2.1.0", "bundled": true, "dev": true }, - "execa": { - "version": "0.7.0", + "is-callable": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "is-ci": { + "version": "1.2.1", "bundled": true, "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "ci-info": "^1.5.0" }, "dependencies": { - "get-stream": { - "version": "3.0.0", + "ci-info": { + "version": "1.6.0", "bundled": true, "dev": true } } }, - "extend": { - "version": "3.0.2", + "is-cidr": { + "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "cidr-regex": "^2.0.10" + } }, - "extsprintf": { - "version": "1.3.0", + "is-date-object": { + "version": "1.0.1", "bundled": true, "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", + "is-fullwidth-code-point": { + "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", + "is-installed-globally": { + "version": "0.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } }, - "figgy-pudding": { - "version": "3.5.1", + "is-npm": { + "version": "1.0.0", "bundled": true, "dev": true }, - "find-npm-prefix": { - "version": "1.0.2", + "is-obj": { + "version": "1.0.1", "bundled": true, "dev": true }, - "find-up": { - "version": "2.1.0", + "is-path-inside": { + "version": "1.0.1", "bundled": true, "dev": true, "requires": { - "locate-path": "^2.0.0" + "path-is-inside": "^1.0.1" } }, - "flush-write-stream": { - "version": "1.0.3", + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-regex": { + "version": "1.0.4", "bundled": true, "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "has": "^1.0.1" } }, - "forever-agent": { - "version": "0.6.1", + "is-retry-allowed": { + "version": "1.2.0", "bundled": true, "dev": true }, - "form-data": { - "version": "2.3.2", + "is-stream": { + "version": "1.1.0", "bundled": true, - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } + "dev": true }, - "from2": { - "version": "2.3.0", + "is-symbol": { + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "has-symbols": "^1.0.0" } }, - "fs-minipass": { - "version": "1.2.7", + "is-typedarray": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "minipass": "^2.6.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } + "dev": true }, - "fs-vacuum": { - "version": "1.2.10", + "isarray": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } + "dev": true }, - "fs-write-stream-atomic": { - "version": "1.0.10", + "isexe": { + "version": "2.0.0", "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "dev": true }, - "fs.realpath": { - "version": "1.0.0", + "isstream": { + "version": "0.1.2", "bundled": true, "dev": true }, - "function-bind": { - "version": "1.1.1", + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", "bundled": true, "dev": true }, - "gauge": { - "version": "2.7.4", + "json-schema": { + "version": "0.2.3", "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } + "dev": true }, - "genfun": { - "version": "5.0.0", + "json-schema-traverse": { + "version": "0.3.1", "bundled": true, "dev": true }, - "gentle-fs": { - "version": "2.3.0", + "json-stringify-safe": { + "version": "5.0.1", "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2", - "chownr": "^1.1.2", - "cmd-shim": "^3.0.3", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "infer-owner": "^1.0.4", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } + "dev": true }, - "get-caller-file": { - "version": "1.0.3", + "jsonparse": { + "version": "1.3.1", "bundled": true, "dev": true }, - "get-stream": { - "version": "4.1.0", + "jsprim": { + "version": "1.4.1", "bundled": true, "dev": true, "requires": { - "pump": "^3.0.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "getpass": { - "version": "0.1.7", + "latest-version": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "assert-plus": "^1.0.0" + "package-json": "^4.0.0" } }, - "glob": { - "version": "7.1.6", + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "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" + "invert-kv": "^2.0.0" } }, - "global-dirs": { - "version": "0.1.1", + "libcipm": { + "version": "4.0.7", "bundled": true, "dev": true, "requires": { - "ini": "^1.3.4" + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" } }, - "got": { - "version": "6.7.1", + "libnpm": { + "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - } + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.2", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmpublish": "^1.1.2", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.2", + "npm-registry-fetch": "^4.0.0", + "npmlog": "^4.1.2", + "pacote": "^9.5.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.3", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "5.1.0", + "libnpmaccess": { + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0" } }, - "has": { - "version": "1.0.3", + "libnpmconfig": { + "version": "1.2.1", "bundled": true, "dev": true, "requires": { - "function-bind": "^1.1.1" + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + } } }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "bundled": true, - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", + "libnpmhook": { + "version": "5.0.3", "bundled": true, "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" } }, - "http-signature": { - "version": "1.2.0", + "libnpmorg": { + "version": "1.0.1", "bundled": true, "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" } }, - "https-proxy-agent": { - "version": "2.2.4", + "libnpmpublish": { + "version": "1.1.2", "bundled": true, "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" } }, - "humanize-ms": { - "version": "1.2.1", + "libnpmsearch": { + "version": "2.0.2", "bundled": true, "dev": true, "requires": { - "ms": "^2.0.0" + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" } }, - "iconv-lite": { - "version": "0.4.23", + "libnpmteam": { + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" } }, - "iferr": { - "version": "1.0.2", + "libnpx": { + "version": "10.2.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } }, - "ignore-walk": { - "version": "3.0.3", + "locate-path": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "minimatch": "^3.0.4" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "import-lazy": { + "lock-verify": { "version": "2.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "npm-package-arg": "^6.1.0", + "semver": "^5.4.1" + } }, - "imurmurhash": { - "version": "0.1.4", + "lockfile": { + "version": "1.0.4", "bundled": true, - "dev": true + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } }, - "infer-owner": { - "version": "1.0.4", + "lodash._baseindexof": { + "version": "3.1.0", "bundled": true, "dev": true }, - "inflight": { - "version": "1.0.6", + "lodash._baseuniq": { + "version": "4.6.0", "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" } }, - "inherits": { - "version": "2.0.4", + "lodash._bindcallback": { + "version": "3.0.1", "bundled": true, "dev": true }, - "ini": { - "version": "1.3.5", + "lodash._cacheindexof": { + "version": "3.0.2", "bundled": true, "dev": true }, - "init-package-json": { - "version": "1.10.3", + "lodash._createcache": { + "version": "3.1.2", "bundled": true, "dev": true, "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "lodash._getnative": "^3.0.0" } }, - "invert-kv": { - "version": "2.0.0", + "lodash._createset": { + "version": "4.0.3", "bundled": true, "dev": true }, - "ip": { - "version": "1.1.5", + "lodash._getnative": { + "version": "3.9.1", "bundled": true, "dev": true }, - "ip-regex": { - "version": "2.1.0", + "lodash._root": { + "version": "3.0.1", "bundled": true, "dev": true }, - "is-callable": { - "version": "1.1.4", + "lodash.clonedeep": { + "version": "4.5.0", "bundled": true, "dev": true }, - "is-ci": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^1.5.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "bundled": true, - "dev": true - } - } - }, - "is-cidr": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^2.0.10" - } - }, - "is-date-object": { - "version": "1.0.1", + "lodash.restparam": { + "version": "3.6.1", "bundled": true, "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", + "lodash.union": { + "version": "4.6.0", "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "dev": true }, - "is-installed-globally": { - "version": "0.1.0", + "lodash.uniq": { + "version": "4.5.0", "bundled": true, - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } + "dev": true }, - "is-npm": { - "version": "1.0.0", + "lodash.without": { + "version": "4.4.0", "bundled": true, "dev": true }, - "is-obj": { + "lowercase-keys": { "version": "1.0.1", "bundled": true, "dev": true }, - "is-path-inside": { - "version": "1.0.1", + "lru-cache": { + "version": "5.1.1", "bundled": true, "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "yallist": "^3.0.2" } }, - "is-redirect": { - "version": "1.0.0", + "make-dir": { + "version": "1.3.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "pify": "^3.0.0" + } }, - "is-regex": { - "version": "1.0.4", + "make-fetch-happen": { + "version": "5.0.2", "bundled": true, "dev": true, "requires": { - "has": "^1.0.1" + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" } }, - "is-retry-allowed": { - "version": "1.2.0", + "map-age-cleaner": { + "version": "0.1.3", "bundled": true, - "dev": true + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } }, - "is-stream": { - "version": "1.1.0", + "meant": { + "version": "1.0.1", "bundled": true, "dev": true }, - "is-symbol": { - "version": "1.0.2", + "mem": { + "version": "4.3.0", "bundled": true, "dev": true, "requires": { - "has-symbols": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "bundled": true, + "dev": true + } } }, - "is-typedarray": { - "version": "1.0.0", + "mime-db": { + "version": "1.35.0", "bundled": true, "dev": true }, - "isarray": { - "version": "1.0.0", + "mime-types": { + "version": "2.1.19", "bundled": true, - "dev": true + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } }, - "isexe": { - "version": "2.0.0", + "minimatch": { + "version": "3.0.4", "bundled": true, - "dev": true + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, - "isstream": { - "version": "0.1.2", + "minizlib": { + "version": "1.3.3", "bundled": true, - "dev": true + "dev": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } }, - "jsbn": { - "version": "0.1.1", + "mississippi": { + "version": "3.0.0", "bundled": true, "dev": true, - "optional": true + "requires": { + "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" + } }, - "json-parse-better-errors": { - "version": "1.0.2", + "mkdirp": { + "version": "0.5.5", "bundled": true, - "dev": true + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + } + } }, - "json-schema": { - "version": "0.2.3", + "move-concurrently": { + "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } }, - "json-schema-traverse": { - "version": "0.3.1", + "ms": { + "version": "2.1.1", "bundled": true, "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", + "mute-stream": { + "version": "0.0.7", "bundled": true, "dev": true }, - "jsonparse": { - "version": "1.3.1", + "nice-try": { + "version": "1.0.5", "bundled": true, "dev": true }, - "jsprim": { - "version": "1.4.1", + "node-fetch-npm": { + "version": "2.0.2", "bundled": true, "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" } }, - "latest-version": { - "version": "3.1.0", + "node-gyp": { + "version": "5.1.0", "bundled": true, "dev": true, "requires": { - "package-json": "^4.0.0" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" } }, - "lazy-property": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", + "nopt": { + "version": "4.0.3", "bundled": true, "dev": true, "requires": { - "invert-kv": "^2.0.0" - } + "abbrev": "1", + "osenv": "^0.1.4" + } }, - "libcipm": { - "version": "4.0.7", + "normalize-package-data": { + "version": "2.5.0", "bundled": true, "dev": true, "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "ini": "^1.3.5", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^9.1.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } } }, - "libnpm": { - "version": "3.0.1", + "npm-audit-report": { + "version": "1.3.2", "bundled": true, "dev": true, "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^3.0.2", - "libnpmconfig": "^1.2.1", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmpublish": "^1.1.2", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "lock-verify": "^2.0.2", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.2", - "npm-registry-fetch": "^4.0.0", - "npmlog": "^4.1.2", - "pacote": "^9.5.3", - "read-package-json": "^2.0.13", - "stringify-package": "^1.0.0" + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" } }, - "libnpmaccess": { - "version": "3.0.2", + "npm-bundled": { + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0" + "npm-normalize-package-bin": "^1.0.1" } }, - "libnpmconfig": { - "version": "1.2.1", + "npm-cache-filename": { + "version": "1.0.2", "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "bundled": true, - "dev": true - } - } + "dev": true }, - "libnpmhook": { - "version": "5.0.3", + "npm-install-checks": { + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "semver": "^2.3.0 || 3.x || 4 || 5" } }, - "libnpmorg": { - "version": "1.0.1", + "npm-lifecycle": { + "version": "3.1.4", "bundled": true, "dev": true, "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "byline": "^5.0.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" } }, - "libnpmpublish": { - "version": "1.1.2", + "npm-logical-tree": { + "version": "1.2.1", "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - } + "dev": true }, - "libnpmsearch": { - "version": "2.0.2", + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", "bundled": true, "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" } }, - "libnpmteam": { - "version": "1.0.2", + "npm-packlist": { + "version": "1.4.8", "bundled": true, "dev": true, "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, - "libnpx": { - "version": "10.2.2", + "npm-pick-manifest": { + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "dotenv": "^5.0.1", + "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^11.0.0" + "semver": "^5.4.1" } }, - "locate-path": { - "version": "2.0.0", + "npm-profile": { + "version": "4.0.4", "bundled": true, "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^4.0.0" } }, - "lock-verify": { - "version": "2.1.0", + "npm-registry-fetch": { + "version": "4.0.4", "bundled": true, "dev": true, "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", "npm-package-arg": "^6.1.0", - "semver": "^5.4.1" + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true, + "dev": true + } } }, - "lockfile": { - "version": "1.0.4", + "npm-run-path": { + "version": "2.0.2", "bundled": true, "dev": true, "requires": { - "signal-exit": "^3.0.2" + "path-key": "^2.0.0" } }, - "lodash._baseindexof": { - "version": "3.1.0", + "npm-user-validate": { + "version": "1.0.0", "bundled": true, "dev": true }, - "lodash._baseuniq": { - "version": "4.6.0", + "npmlog": { + "version": "4.1.2", "bundled": true, "dev": true, "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "lodash._bindcallback": { - "version": "3.0.1", + "number-is-nan": { + "version": "1.0.1", "bundled": true, "dev": true }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "bundled": true, - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true, - "dev": true - }, - "lodash._root": { - "version": "3.0.1", + "oauth-sign": { + "version": "0.9.0", "bundled": true, "dev": true }, - "lodash.clonedeep": { - "version": "4.5.0", + "object-assign": { + "version": "4.1.1", "bundled": true, "dev": true }, - "lodash.restparam": { - "version": "3.6.1", + "object-keys": { + "version": "1.0.12", "bundled": true, "dev": true }, - "lodash.union": { - "version": "4.6.0", + "object.getownpropertydescriptors": { + "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } }, - "lodash.uniq": { - "version": "4.5.0", + "once": { + "version": "1.4.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "wrappy": "1" + } }, - "lodash.without": { - "version": "4.4.0", + "opener": { + "version": "1.5.1", "bundled": true, "dev": true }, - "lowercase-keys": { - "version": "1.0.1", + "os-homedir": { + "version": "1.0.2", "bundled": true, "dev": true }, - "lru-cache": { - "version": "5.1.1", + "os-locale": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "yallist": "^3.0.2" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "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" + } + } } }, - "make-dir": { - "version": "1.3.0", + "os-tmpdir": { + "version": "1.0.2", "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } + "dev": true }, - "make-fetch-happen": { - "version": "5.0.2", + "osenv": { + "version": "0.1.5", "bundled": true, "dev": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "map-age-cleaner": { - "version": "0.1.3", + "p-defer": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } + "dev": true }, - "meant": { - "version": "1.0.1", + "p-finally": { + "version": "1.0.0", "bundled": true, "dev": true }, - "mem": { - "version": "4.3.0", + "p-is-promise": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "bundled": true, - "dev": true - } + "p-try": "^1.0.0" } }, - "mime-db": { - "version": "1.35.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.19", + "p-locate": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "mime-db": "~1.35.0" + "p-limit": "^1.1.0" } }, - "minimatch": { - "version": "3.0.4", + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, - "minizlib": { - "version": "1.3.3", + "pacote": { + "version": "9.5.12", "bundled": true, "dev": true, "requires": { - "minipass": "^2.9.0" + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { "minipass": { @@ -14073,3232 +12300,2163 @@ } } }, - "mississippi": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "mkdirp": { - "version": "0.5.4", + "parallel-transform": { + "version": "1.1.0", "bundled": true, "dev": true, "requires": { - "minimist": "^1.2.5" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" }, "dependencies": { - "minimist": { - "version": "1.2.5", + "readable-stream": { + "version": "2.3.6", "bundled": true, - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "ms": { - "version": "2.1.1", + "path-exists": { + "version": "3.0.0", "bundled": true, "dev": true }, - "mute-stream": { - "version": "0.0.7", + "path-is-absolute": { + "version": "1.0.1", "bundled": true, "dev": true }, - "nice-try": { - "version": "1.0.5", + "path-is-inside": { + "version": "1.0.2", "bundled": true, "dev": true }, - "node-fetch-npm": { - "version": "2.0.2", + "path-key": { + "version": "2.0.1", "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } + "dev": true }, - "node-gyp": { - "version": "5.1.0", + "path-parse": { + "version": "1.0.6", "bundled": true, - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - } + "dev": true }, - "nopt": { - "version": "4.0.1", + "performance-now": { + "version": "2.1.0", "bundled": true, - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + "dev": true }, - "normalize-package-data": { - "version": "2.5.0", + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "dependencies": { - "resolve": { - "version": "1.10.0", + "retry": { + "version": "0.10.1", "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "dev": true } } }, - "npm-audit-report": { - "version": "1.3.2", + "promzard": { + "version": "0.3.0", "bundled": true, "dev": true, "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" + "read": "1" } }, - "npm-bundled": { - "version": "1.1.1", + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.1", "bundled": true, "dev": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "genfun": "^5.0.0" } }, - "npm-cache-filename": { + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { "version": "1.0.2", "bundled": true, "dev": true }, - "npm-install-checks": { - "version": "3.0.2", + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "npm-lifecycle": { - "version": "3.1.4", + "pumpify": { + "version": "1.5.1", "bundled": true, "dev": true, "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, - "npm-logical-tree": { - "version": "1.2.1", + "punycode": { + "version": "1.4.1", "bundled": true, "dev": true }, - "npm-normalize-package-bin": { - "version": "1.0.1", + "qrcode-terminal": { + "version": "0.12.0", "bundled": true, "dev": true }, - "npm-package-arg": { - "version": "6.1.1", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "1.4.8", + "qs": { + "version": "6.5.2", "bundled": true, - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } + "dev": true }, - "npm-pick-manifest": { - "version": "3.0.2", + "query-string": { + "version": "6.8.2", "bundled": true, "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" } }, - "npm-profile": { - "version": "4.0.4", + "qw": { + "version": "1.0.1", "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2 || 2", - "figgy-pudding": "^3.4.1", - "npm-registry-fetch": "^4.0.0" - } + "dev": true }, - "npm-registry-fetch": { - "version": "4.0.3", + "rc": { + "version": "1.2.8", "bundled": true, "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { - "safe-buffer": { - "version": "5.2.0", + "minimist": { + "version": "1.2.5", "bundled": true, "dev": true } } }, - "npm-run-path": { - "version": "2.0.2", + "read": { + "version": "1.0.7", "bundled": true, "dev": true, "requires": { - "path-key": "^2.0.0" + "mute-stream": "~0.0.4" } }, - "npm-user-validate": { - "version": "1.0.0", + "read-cmd-shim": { + "version": "1.0.5", "bundled": true, - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } }, - "npmlog": { - "version": "4.1.2", + "read-installed": { + "version": "4.0.3", "bundled": true, "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" } }, - "number-is-nan": { - "version": "1.0.1", + "read-package-json": { + "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } }, - "oauth-sign": { - "version": "0.9.0", + "read-package-tree": { + "version": "5.3.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } }, - "object-assign": { - "version": "4.1.1", + "readable-stream": { + "version": "3.6.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } }, - "object-keys": { - "version": "1.0.12", + "readdir-scoped-modules": { + "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", + "registry-auth-token": { + "version": "3.4.0", "bundled": true, "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "once": { - "version": "1.4.0", + "registry-url": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "rc": "^1.0.1" } }, - "opener": { - "version": "1.5.1", + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", "bundled": true, "dev": true }, - "os-homedir": { - "version": "1.0.2", + "require-main-filename": { + "version": "1.0.1", "bundled": true, "dev": true }, - "os-locale": { - "version": "3.1.0", + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.7.1", "bundled": true, "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", + "aproba": { + "version": "1.2.0", "bundled": true, - "dev": true, - "requires": { - "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" - } + "dev": true } } }, - "os-tmpdir": { - "version": "1.0.2", + "safe-buffer": { + "version": "5.1.2", "bundled": true, "dev": true }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true }, - "p-finally": { - "version": "1.0.0", + "semver": { + "version": "5.7.1", "bundled": true, "dev": true }, - "p-is-promise": { + "semver-diff": { "version": "2.1.0", "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, "dev": true }, - "p-limit": { - "version": "1.2.0", + "sha": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "p-try": "^1.0.0" + "graceful-fs": "^4.1.2" } }, - "p-locate": { - "version": "2.0.0", + "shebang-command": { + "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "p-limit": "^1.1.0" + "shebang-regex": "^1.0.0" } }, - "p-try": { + "shebang-regex": { "version": "1.0.0", "bundled": true, "dev": true }, - "package-json": { - "version": "4.0.1", + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.3.3", "bundled": true, "dev": true, "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, - "pacote": { - "version": "9.5.12", + "socks-proxy-agent": { + "version": "4.0.2", "bundled": true, "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "agent-base": "~4.2.1", + "socks": "~2.3.2" }, "dependencies": { - "minipass": { - "version": "2.9.0", + "agent-base": { + "version": "4.2.1", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "es6-promisify": "^5.0.0" } } } }, - "parallel-transform": { - "version": "1.1.0", + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", "bundled": true, "dev": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" }, "dependencies": { - "readable-stream": { - "version": "2.3.6", + "from2": { + "version": "1.3.0", "bundled": true, "dev": true, "requires": { - "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" + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" } }, - "string_decoder": { - "version": "1.1.1", + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", "bundled": true, "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true } } }, - "path-exists": { + "spdx-correct": { "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "path-is-absolute": { - "version": "1.0.1", + "spdx-exceptions": { + "version": "2.1.0", "bundled": true, "dev": true }, - "path-is-inside": { - "version": "1.0.2", + "spdx-expression-parse": { + "version": "3.0.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "path-key": { - "version": "2.0.1", + "spdx-license-ids": { + "version": "3.0.3", "bundled": true, "dev": true }, - "path-parse": { - "version": "1.0.6", + "split-on-first": { + "version": "1.1.0", "bundled": true, "dev": true }, - "performance-now": { - "version": "2.1.0", + "sshpk": { + "version": "1.14.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "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" + } }, - "pify": { - "version": "3.0.0", + "ssri": { + "version": "6.0.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } }, - "prepend-http": { - "version": "1.0.4", + "stream-each": { + "version": "1.2.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } }, - "process-nextick-args": { - "version": "2.0.0", + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", "bundled": true, "dev": true }, - "promise-inflight": { - "version": "1.0.1", + "strict-uri-encode": { + "version": "2.0.0", "bundled": true, "dev": true }, - "promise-retry": { - "version": "1.1.1", + "string-width": { + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "retry": { - "version": "0.10.1", + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", "bundled": true, "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, - "promzard": { - "version": "0.3.0", + "string_decoder": { + "version": "1.3.0", "bundled": true, "dev": true, "requires": { - "read": "1" + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true, + "dev": true + } } }, - "proto-list": { - "version": "1.2.4", + "stringify-package": { + "version": "1.0.1", "bundled": true, "dev": true }, - "protoduck": { - "version": "5.0.1", + "strip-ansi": { + "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "genfun": "^5.0.0" + "ansi-regex": "^2.0.0" } }, - "prr": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", + "strip-eof": { + "version": "1.0.0", "bundled": true, "dev": true }, - "psl": { - "version": "1.1.29", + "strip-json-comments": { + "version": "2.0.1", "bundled": true, "dev": true }, - "pump": { - "version": "3.0.0", + "supports-color": { + "version": "5.4.0", "bundled": true, "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "has-flag": "^3.0.0" } }, - "pumpify": { - "version": "1.5.1", + "tar": { + "version": "4.4.13", "bundled": true, "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" }, "dependencies": { - "pump": { - "version": "2.0.1", + "minipass": { + "version": "2.9.0", "bundled": true, "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } } } }, - "punycode": { - "version": "1.4.1", + "term-size": { + "version": "1.2.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "execa": "^0.7.0" + } }, - "qrcode-terminal": { - "version": "0.12.0", + "text-table": { + "version": "0.2.0", "bundled": true, "dev": true }, - "qs": { - "version": "6.5.2", + "through": { + "version": "2.3.8", "bundled": true, "dev": true }, - "query-string": { - "version": "6.8.2", + "through2": { + "version": "2.0.3", "bundled": true, "dev": true, "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "qw": { - "version": "1.0.1", + "timed-out": { + "version": "4.0.1", "bundled": true, "dev": true }, - "rc": { - "version": "1.2.8", + "tiny-relative-date": { + "version": "1.3.0", "bundled": true, - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true - } - } + "dev": true }, - "read": { - "version": "1.0.7", + "tough-cookie": { + "version": "2.4.3", "bundled": true, "dev": true, "requires": { - "mute-stream": "~0.0.4" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, - "read-cmd-shim": { - "version": "1.0.5", + "tunnel-agent": { + "version": "0.6.0", "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2" + "safe-buffer": "^5.0.1" } }, - "read-installed": { - "version": "4.0.3", + "tweetnacl": { + "version": "0.14.5", "bundled": true, "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - } + "optional": true }, - "read-package-json": { - "version": "2.1.1", + "typedarray": { + "version": "0.0.6", "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } + "dev": true }, - "read-package-tree": { - "version": "5.3.1", + "uid-number": { + "version": "0.0.6", "bundled": true, - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } + "dev": true }, - "readable-stream": { - "version": "3.6.0", + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.1", "bundled": true, "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "unique-slug": "^2.0.0" } }, - "readdir-scoped-modules": { - "version": "1.1.0", + "unique-slug": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "imurmurhash": "^0.1.4" } }, - "registry-auth-token": { - "version": "3.4.0", + "unique-string": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "crypto-random-string": "^1.0.0" } }, - "registry-url": { - "version": "3.1.0", + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", "bundled": true, "dev": true, "requires": { - "rc": "^1.0.1" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "request": { - "version": "2.88.0", + "url-parse-lax": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "prepend-http": "^1.0.1" } }, - "require-directory": { - "version": "2.1.1", + "util-deprecate": { + "version": "1.0.2", "bundled": true, "dev": true }, - "require-main-filename": { - "version": "1.0.1", + "util-extend": { + "version": "1.0.3", "bundled": true, "dev": true }, - "resolve-from": { - "version": "4.0.0", + "util-promisify": { + "version": "2.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } }, - "retry": { - "version": "0.12.0", + "uuid": { + "version": "3.3.3", "bundled": true, "dev": true }, - "rimraf": { - "version": "2.7.1", + "validate-npm-package-license": { + "version": "3.0.4", "bundled": true, "dev": true, "requires": { - "glob": "^7.1.3" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "run-queue": { - "version": "1.0.3", + "validate-npm-package-name": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "aproba": "^1.1.1" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - } + "builtins": "^1.0.3" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true - }, - "semver-diff": { - "version": "2.1.0", + "verror": { + "version": "1.10.0", "bundled": true, "dev": true, "requires": { - "semver": "^5.0.3" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "sha": { - "version": "3.0.0", + "wcwidth": { + "version": "1.0.1", "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2" + "defaults": "^1.0.3" } }, - "shebang-command": { - "version": "1.2.0", + "which": { + "version": "1.3.1", "bundled": true, "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "isexe": "^2.0.0" } }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", + "which-module": { + "version": "2.0.0", "bundled": true, "dev": true }, - "socks": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", + "wide-align": { + "version": "1.1.2", "bundled": true, "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "string-width": "^1.0.2" }, "dependencies": { - "agent-base": { - "version": "4.2.1", + "string-width": { + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } }, - "sorted-object": { + "widest-line": { "version": "2.0.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "string-width": "^2.1.1" + } }, - "sorted-union-stream": { - "version": "2.1.3", + "worker-farm": { + "version": "1.7.0", "bundled": true, "dev": true, "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "isarray": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "readable-stream": { - "version": "1.1.14", + "string-width": { + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true, - "dev": true } } }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", + "wrappy": { + "version": "1.0.2", "bundled": true, "dev": true }, - "spdx-expression-parse": { - "version": "3.0.0", + "write-file-atomic": { + "version": "2.4.3", "bundled": true, "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "spdx-license-ids": { - "version": "3.0.3", + "xdg-basedir": { + "version": "3.0.0", "bundled": true, "dev": true }, - "split-on-first": { - "version": "1.1.0", + "xtend": { + "version": "4.0.1", "bundled": true, "dev": true }, - "sshpk": { - "version": "1.14.2", - "bundled": true, - "dev": true, - "requires": { - "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", + "y18n": { + "version": "4.0.0", "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } + "dev": true }, - "stream-each": { - "version": "1.2.2", + "yallist": { + "version": "3.0.3", "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } + "dev": true }, - "stream-iterate": { - "version": "1.2.0", + "yargs": { + "version": "11.1.1", "bundled": true, "dev": true, "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" }, "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", + "y18n": { + "version": "3.2.1", "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "dev": true } } }, - "stream-shift": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", + "yargs-parser": { + "version": "9.0.2", "bundled": true, "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "camelcase": "^4.1.0" } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, + } + } + }, + "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=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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=", "dev": true, "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "bundled": true, - "dev": true - } + "is-descriptor": "^0.1.0" } }, - "stringify-package": { - "version": "1.0.1", - "bundled": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "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==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "strip-ansi": { + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "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==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "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.1", + "string.prototype.trimright": "^2.1.1" } }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, + "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==", "dev": true }, - "supports-color": { - "version": "5.4.0", - "bundled": true, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has": "^1.0.3" } }, - "tar": { - "version": "4.4.13", - "bundled": true, + "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==", + "dev": true + }, + "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==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "through": { - "version": "2.3.8", - "bundled": true, - "dev": true - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "bundled": true, - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "umask": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "prepend-http": "^1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "util-extend": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "util-promisify": { - "version": "2.1.0", - "bundled": true, + "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==", "dev": true, "requires": { - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } - }, - "uuid": { - "version": "3.3.3", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opal-runtime": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", + "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", + "dev": true, + "requires": { + "glob": "6.0.4", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "bundled": true, - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "xtend": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, - "npm-run-path": { + "opencollective-postinstall": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "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=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "p-map": "^2.0.0" } }, - "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==", + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "p-try": "^1.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==", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "p-limit": "^1.1.0" } }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true + }, + "p-retry": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz", + "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "@types/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=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "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==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" } }, - "object.getownpropertydescriptors": { + "pkg-conf": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "dependencies": { - "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==", - "dev": true, - "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.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "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==", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "has": "^1.0.3" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "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==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } } } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "find-up": "^2.1.0" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "dev": true + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "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=", - "dev": true - } + "semver-compare": "^1.0.0" } }, - "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==", + "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=", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-format": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.0.1.tgz", + "integrity": "sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "@jest/types": "^26.0.1", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, "dependencies": { - "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==", - "dev": true, - "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.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "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==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "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==", "dev": true, "requires": { - "has": "^1.0.3" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "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==", - "dev": true - }, - "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==", + "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==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "color-name": "~1.1.4" } }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } + "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==", + "dev": true } } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { - "wrappy": "1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "opal-runtime": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", - "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "glob": "6.0.4", - "xmlhttprequest": "1.8.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "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=", + "dev": true } } }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } } } }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "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==", "dev": true, "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", "dev": true, "requires": { - "p-map": "^2.0.0" + "esprima": "~4.0.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true, + "optional": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "p-try": "^1.0.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "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==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "rc": "^1.2.8" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "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=", "dev": true }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, - "p-retry": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz", - "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==", + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.12.0" + "is-finite": "^1.0.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=", - "dev": true + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } }, - "pad": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", - "integrity": "sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw==", + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "wcwidth": "^1.0.1" + "lodash": "^4.17.15" } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "callsites": "^3.0.0" + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } } } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "path-parse": "^1.0.6" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "optional": true, + "requires": { + "global-dirs": "^0.1.1" + } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "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==", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pkg-dir": { + "restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "semver-compare": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "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=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - } + "glob": "^7.1.3" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "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==", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "tslib": "^1.9.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "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==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "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=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "optional": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "right-pad": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", - "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "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=", - "dev": true, - "requires": { - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "ret": "~0.1.10" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "semantic-release": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.4.tgz", - "integrity": "sha512-5y9QRSrZtdvACmlpX5DvEVsvFuKRDUVn7JVJFxPVLGrGofDf1d0M/+hA1wFmCjiJZ+VCY8bYaSqVqF14KCF9rw==", + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.7.tgz", + "integrity": "sha512-F6FzJI1yiGavzCTXir4yPthK/iozZPJ4myUYndiHhSHbmOcCSJ2m7V+P6sFwVpDpQKQp1Q31M68sTJ/Q/27Bow==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^8.0.0", @@ -17318,67 +14476,19 @@ "hook-std": "^2.0.0", "hosted-git-info": "^3.0.0", "lodash": "^4.17.15", - "marked": "^0.8.0", + "marked": "^1.0.0", "marked-terminal": "^4.0.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "p-reduce": "^2.0.0", "read-pkg-up": "^7.0.0", "resolve-from": "^5.0.0", - "semver": "^7.1.1", + "semver": "^7.3.2", "semver-diff": "^3.1.1", "signale": "^1.2.1", "yargs": "^15.0.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.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==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.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==", - "dev": true, - "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==", - "dev": true - }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -17393,9 +14503,9 @@ } }, "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -17413,9 +14523,9 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -17448,12 +14558,6 @@ "path-exists": "^4.0.0" } }, - "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==", - "dev": true - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -17472,12 +14576,6 @@ "lru-cache": "^5.1.1" } }, - "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==", - "dev": true - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -17543,9 +14641,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -17584,12 +14682,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -17627,59 +14719,12 @@ "type-fest": "^0.8.1" } }, - "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==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - }, - "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==", - "dev": true, - "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==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -17695,57 +14740,11 @@ "isexe": "^2.0.0" } }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "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==", - "dev": true - }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -17814,24 +14813,24 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shelljs": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz", - "integrity": "sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0=", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, "requires": { "glob": "^7.0.0", @@ -17843,7 +14842,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", @@ -17868,21 +14868,6 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -17994,12 +14979,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -18010,6 +14989,17 @@ "dev": true, "requires": { "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "source-map": { @@ -18019,12 +15009,12 @@ "dev": true }, "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==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -18112,6 +15102,36 @@ "through2": "^2.0.2" }, "dependencies": { + "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==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -18148,10 +15168,21 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "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==", + "dev": true + } + } }, "static-extend": { "version": "0.1.2", @@ -18188,16 +15219,38 @@ "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" - } - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "string-width": { @@ -18208,6 +15261,23 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string.prototype.trimend": { @@ -18415,27 +15485,27 @@ } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true } } @@ -18459,21 +15529,18 @@ "dev": true }, "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } }, "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=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "supports-hyperlinks": { @@ -18503,12 +15570,6 @@ } } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -18527,12 +15588,6 @@ "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==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -18569,15 +15624,6 @@ "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==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -18650,50 +15696,6 @@ } } }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - } - } - }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -18715,12 +15717,6 @@ "asciidoctor.js": "^1.5.9" } }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -18751,12 +15747,6 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -18764,6 +15754,17 @@ "dev": true, "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -18788,22 +15789,23 @@ } }, "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { + "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "traverse": { @@ -18813,9 +15815,9 @@ "dev": true }, "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", "dev": true }, "trim-off-newlines": { @@ -18824,16 +15826,10 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tsutils": { @@ -18861,12 +15857,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -18876,9 +15872,9 @@ "dev": true }, "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==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true }, "typedarray-to-buffer": { @@ -19016,103 +16012,10 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "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==", - "dev": true, - "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.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - } - } - }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { @@ -19122,9 +16025,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", - "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -19162,22 +16065,20 @@ } }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, @@ -19190,37 +16091,10 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, "whatwg-encoding": { @@ -19238,17 +16112,6 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -19271,9 +16134,9 @@ "dev": true }, "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", + "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", "dev": true, "requires": { "execa": "^1.0.0" @@ -19291,16 +16154,6 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -19316,26 +16169,6 @@ "mkdirp": "^0.5.1" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -19360,25 +16193,13 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz", + "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==", "dev": true, "requires": { - "@babel/runtime": "^7.8.7" + "@babel/runtime": "^7.9.2" } }, "yargs": { @@ -19474,9 +16295,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -19549,9 +16370,9 @@ } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 50562a55..0e95b935 100644 --- a/package.json +++ b/package.json @@ -36,20 +36,19 @@ "@semantic-release/git": "^9.0.0", "benchmark": "2.1.4", "braces": ">=2.3.1", - "commitizen": "^4.0.3", - "conventional-changelog-cli": "^2.0.31", - "cz-conventional-changelog": "^3.1.0", - "cz-emoji": "github:amejiarosario/cz-emoji", - "eslint": "6.8.0", + "commitizen": "4.1.2", + "conventional-changelog-cli": "2.0.34", + "cz-conventional-changelog": "3.2.0", + "eslint": "7.0.0", "eslint-config-airbnb-base": "14.1.0", "eslint-plugin-import": "2.20.2", - "eslint-plugin-jest": "23.8.2", + "eslint-plugin-jest": "23.11.0", "handlebars": "4.7.6", - "husky": "^4.2.3", - "jest": "25.2.7", + "husky": "4.2.5", + "jest": "26.0.1", "js-yaml": ">=3.13.1", - "mem": "6.0.1", - "semantic-release": "^17.0.4", + "mem": "6.1.0", + "semantic-release": "17.0.7", "textlint-plugin-asciidoctor": "1.0.3" }, "engines": { @@ -57,41 +56,21 @@ }, "config": { "commitizen": { - "path": "cz-emoji" - }, - "cz-emoji": { - "types": [ - { - "emoji": "🐛", - "code": ":bug: fix", - "description": "Fixing a bug on code.", - "name": "fix code" - }, - { - "emoji": "📝", - "code": ":pencil: fix", - "description": "Fixing typos on book.", - "name": "fix typo" - }, - { - "emoji": "✨", - "code": ":sparkles: feat", + "path": "cz-conventional-changelog", + "types": { + "feat": { "description": "Introducing new features on code and/or book.", - "name": "feature" + "title": "Features ✨" }, - { - "emoji": "💥", - "code": ":boom: break", - "description": "Introducing breaking changes.", - "name": "breaking" + "fix": { + "description": "Fixing a bug on code or book", + "title": "Bug Fixes 🐛" }, - { - "emoji": "🔩", - "code": ":wrench: chore", - "description": "Adding CI/build tools.", - "name": "chore" + "chore": { + "description": "Other changes that don't modify code or book files", + "title": "Chores 🔩" } - ] + } } }, "husky": { @@ -103,21 +82,7 @@ "tagFormat": "${version}", "branch": "master", "plugins": [ - ["@semantic-release/commit-analyzer", { - "preset": "angular", - "releaseRules": [ - {"type": "fix", "release": "patch"}, - {"type": "feat", "release": "minor"}, - {"type": "break", "release": "major"}, - {"header": ":bug:*", "release": "patch"}, - {"header": ":pencil:*", "release": "patch"}, - {"header": ":sparkles:*", "release": "minor"}, - {"header": ":boom:*", "release": "major"} - ], - "parserOpts": { - "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"] - } - }], + "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/github", diff --git a/src/data-structures/maps/hash-maps/hash-map.js b/src/data-structures/maps/hash-maps/hash-map.js index 2fdd5324..0ce606ed 100644 --- a/src/data-structures/maps/hash-maps/hash-map.js +++ b/src/data-structures/maps/hash-maps/hash-map.js @@ -252,7 +252,7 @@ class HashMap { } /** - * the same function object as the initial value of the `entries` method. + * The same function object as the initial value of the `entries` method. * Contains the [key, value] pairs for each element in the Map. */ * [Symbol.iterator]() { From 142c3010c9131d08646637a2388cdba6ff35a313 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 16 May 2020 01:09:16 +0000 Subject: [PATCH 070/200] :bookmark: chore(release): 1.7.0 # [1.7.0](https://github.com/amejiarosario/dsa.js/compare/1.6.0...1.7.0) (2020-05-16) ### Features * **heap:** add min/max/median-heaps ([202ca9f](https://github.com/amejiarosario/dsa.js/commit/202ca9f989ddba433b4f591e27bc094640cbbadf)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aac51f6..6b7d47a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.7.0](https://github.com/amejiarosario/dsa.js/compare/1.6.0...1.7.0) (2020-05-16) + + +### Features + +* **heap:** add min/max/median-heaps ([202ca9f](https://github.com/amejiarosario/dsa.js/commit/202ca9f989ddba433b4f591e27bc094640cbbadf)) + # [1.6.0](https://github.com/amejiarosario/dsa.js/compare/1.5.0...1.6.0) (2020-05-08) # [1.5.0](https://github.com/amejiarosario/dsa.js/compare/1.4.0...1.5.0) (2020-03-30) diff --git a/package-lock.json b/package-lock.json index 1215b5f8..6ce8be21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.6.0", + "version": "1.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2dae27f8..d81212a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.6.0", + "version": "1.7.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From c2539383e67a195857d60301318dbb27737ca452 Mon Sep 17 00:00:00 2001 From: nuintun <1730277+nuintun@users.noreply.github.com> Date: Wed, 20 May 2020 23:07:23 +0800 Subject: [PATCH 071/200] Better hash function --- src/data-structures/maps/hash-maps/hash-map.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/data-structures/maps/hash-maps/hash-map.js b/src/data-structures/maps/hash-maps/hash-map.js index 0ce606ed..25889587 100644 --- a/src/data-structures/maps/hash-maps/hash-map.js +++ b/src/data-structures/maps/hash-maps/hash-map.js @@ -2,6 +2,9 @@ const LinkedList = require('../../linked-lists/linked-list'); const { nextPrime } = require('./primes'); +// Text encoding +const encoding = new TextEncoder(); + /** * The map holds key-value pairs. * Any value (both objects and primitive values) may be used as either a key or a value. @@ -50,12 +53,16 @@ class HashMap { * @return {integer} bucket index */ hashFunction(key) { - const str = String(key); + const bytes = encoding.encode(key); + const { length } = bytes; + let hash = 2166136261; // FNV_offset_basis (32 bit) - for (let i = 0; i < str.length; i += 1) { - hash ^= str.codePointAt(i); // XOR + + for (let i = 0; i < length; ) { + hash ^= bytes[i++]; // XOR hash *= 16777619; // 32 bit FNV_prime } + return (hash >>> 0) % this.buckets.length; } // end::hashFunction[] From e13ff88d7f8f9b7f38844befedc001bc1a4b243f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 20 May 2020 11:22:12 -0400 Subject: [PATCH 072/200] fix(hashmap): fix TextEncoder reference --- src/data-structures/maps/hash-maps/hash-map.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/data-structures/maps/hash-maps/hash-map.js b/src/data-structures/maps/hash-maps/hash-map.js index 25889587..d5ea7382 100644 --- a/src/data-structures/maps/hash-maps/hash-map.js +++ b/src/data-structures/maps/hash-maps/hash-map.js @@ -1,4 +1,5 @@ /* eslint-disable no-bitwise, no-iterator, no-restricted-syntax */ +const { TextEncoder } = require('util'); const LinkedList = require('../../linked-lists/linked-list'); const { nextPrime } = require('./primes'); @@ -55,14 +56,14 @@ class HashMap { hashFunction(key) { const bytes = encoding.encode(key); const { length } = bytes; - + let hash = 2166136261; // FNV_offset_basis (32 bit) - - for (let i = 0; i < length; ) { - hash ^= bytes[i++]; // XOR + + for (let i = 0; i < length; i++) { + hash ^= bytes[i]; // XOR hash *= 16777619; // 32 bit FNV_prime } - + return (hash >>> 0) % this.buckets.length; } // end::hashFunction[] From 8ea61ce0eaf66facbbc548576ef5435f93a19710 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 20 May 2020 15:29:53 +0000 Subject: [PATCH 073/200] :bookmark: chore(release): 1.7.1 ## [1.7.1](https://github.com/amejiarosario/dsa.js/compare/1.7.0...1.7.1) (2020-05-20) ### Bug Fixes * **hashmap:** fix TextEncoder reference ([e13ff88](https://github.com/amejiarosario/dsa.js/commit/e13ff88d7f8f9b7f38844befedc001bc1a4b243f)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b7d47a8..a4cfc114 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.7.1](https://github.com/amejiarosario/dsa.js/compare/1.7.0...1.7.1) (2020-05-20) + + +### Bug Fixes + +* **hashmap:** fix TextEncoder reference ([e13ff88](https://github.com/amejiarosario/dsa.js/commit/e13ff88d7f8f9b7f38844befedc001bc1a4b243f)) + # [1.7.0](https://github.com/amejiarosario/dsa.js/compare/1.6.0...1.7.0) (2020-05-16) diff --git a/package-lock.json b/package-lock.json index 6ce8be21..112761ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d81212a3..d51fc20b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.7.0", + "version": "1.7.1", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From f6b47b5a6c53126bebbad72ac92da1a594042232 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 23 May 2020 15:13:28 -0400 Subject: [PATCH 074/200] fix(hashmap): improve methods documentation --- src/data-structures/maps/hash-maps/hash-map.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data-structures/maps/hash-maps/hash-map.js b/src/data-structures/maps/hash-maps/hash-map.js index d5ea7382..97d580fb 100644 --- a/src/data-structures/maps/hash-maps/hash-map.js +++ b/src/data-structures/maps/hash-maps/hash-map.js @@ -30,6 +30,15 @@ class HashMap { this.reset(); } + /** + * Reset or reinitialize all values on the hashmap. Used for rehashing. + * + * @param {array} buckets - New bucket. + * @param {number} size - The new size of the hashmap. + * @param {number} collisions - The number of collisions. + * @param {array} keysTrackerArray - The array of keys in insertion order + * @param {number} keysTrackerIndex - The last index of keysTrackerArray + */ reset( buckets = new Array(this.initialCapacity), size = 0, From 924c9a76db91f7df44f7cb38caba3aa9c3f0497f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 23 May 2020 15:25:45 -0400 Subject: [PATCH 075/200] feat(maps): implement clear method for hashMap and treeMap --- src/data-structures/maps/hash-maps/hash-map.js | 11 ++++++++++- .../maps/hash-maps/hash-map.spec.js | 2 +- src/data-structures/maps/map.spec.js | 14 ++++++++++++++ src/data-structures/maps/tree-maps/tree-map.js | 7 +++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/data-structures/maps/hash-maps/hash-map.js b/src/data-structures/maps/hash-maps/hash-map.js index 97d580fb..00a26bea 100644 --- a/src/data-structures/maps/hash-maps/hash-map.js +++ b/src/data-structures/maps/hash-maps/hash-map.js @@ -31,7 +31,9 @@ class HashMap { } /** - * Reset or reinitialize all values on the hashmap. Used for rehashing. + * Reset or reinitialize all values on the hashmap. + * + * Used for rehashing, clear and initializing the map. * * @param {array} buckets - New bucket. * @param {number} size - The new size of the hashmap. @@ -282,6 +284,13 @@ class HashMap { get length() { return this.size; } + + /** + * Removes all key/value pairs from the Map object. + */ + clear() { + this.reset(); + } } // Aliases diff --git a/src/data-structures/maps/hash-maps/hash-map.spec.js b/src/data-structures/maps/hash-maps/hash-map.spec.js index b7ec0d70..daaf93b7 100644 --- a/src/data-structures/maps/hash-maps/hash-map.spec.js +++ b/src/data-structures/maps/hash-maps/hash-map.spec.js @@ -265,7 +265,7 @@ describe('HashMap Tests', () => { hashMap.delete('All About That Bass'); hashMap.set('All About That Bass', 'Meghan Trainor'); expect(hashMap.keysTrackerIndex).toBe(12); - // should hava a hole + // should have a hole expect(hashMap.keysTrackerArray).toEqual(['Pineapple', 'Despacito', 'Bailando', 'Dura', 'Lean On', 'Hello', undefined, 'Wake Me Up', 'Brother', 'Faded', 'The Spectre', 'All About That Bass']); diff --git a/src/data-structures/maps/map.spec.js b/src/data-structures/maps/map.spec.js index 5d8d3749..a69c70e3 100644 --- a/src/data-structures/maps/map.spec.js +++ b/src/data-structures/maps/map.spec.js @@ -138,5 +138,19 @@ mapImplementations.forEach((MapImplementation) => { ]); }); }); + + describe('#clear', () => { + beforeEach(() => { + map.set(1, 2); + map.set(2, 'dos'); + map.set(3, 3); + }); + + it('should work', () => { + expect(map.size).toBe(3); + expect(map.clear()).toEqual(); + expect(map.size).toBe(0); + }); + }); }); }); diff --git a/src/data-structures/maps/tree-maps/tree-map.js b/src/data-structures/maps/tree-maps/tree-map.js index 68562da5..eed8bc78 100644 --- a/src/data-structures/maps/tree-maps/tree-map.js +++ b/src/data-structures/maps/tree-maps/tree-map.js @@ -133,6 +133,13 @@ class TreeMap { yield [node.value, node.data()]; } } + + /** + * Removes all key/value pairs from the Map object. + */ + clear() { + this.tree = new Tree(); + } } // Aliases From 2f24f57f989bb97f198bb32f6daa477d6075dc31 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 23 May 2020 15:44:07 -0400 Subject: [PATCH 076/200] fix(book/map): fix typo on maps space complexity --- book/content/part03/hashmap.asc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/content/part03/hashmap.asc b/book/content/part03/hashmap.asc index 8ae810ab..8bf36ede 100644 --- a/book/content/part03/hashmap.asc +++ b/book/content/part03/hashmap.asc @@ -301,7 +301,7 @@ Hash Map it’s very optimal for searching values by key in constant time *O(1)* .2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity ^|_Index/Key_ ^|_Value_ | Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| Hash Map (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* +| Hash Map (optimized) ^|O(1) ^|O(n) ^|O(1)* ^|O(1) ^|O(n) |=== {empty}* = Amortized run time. E.g. rehashing might affect run time. // end::table[] From 728461980d8658004c24dc20ba09193c503ab856 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 23 May 2020 19:50:34 +0000 Subject: [PATCH 077/200] :bookmark: chore(release): 1.8.0 # [1.8.0](https://github.com/amejiarosario/dsa.js/compare/1.7.1...1.8.0) (2020-05-23) ### Bug Fixes * **book/map:** fix typo on maps space complexity ([2f24f57](https://github.com/amejiarosario/dsa.js/commit/2f24f57f989bb97f198bb32f6daa477d6075dc31)) * **hashmap:** improve methods documentation ([f6b47b5](https://github.com/amejiarosario/dsa.js/commit/f6b47b5a6c53126bebbad72ac92da1a594042232)) ### Features * **maps:** implement clear method for hashMap and treeMap ([924c9a7](https://github.com/amejiarosario/dsa.js/commit/924c9a76db91f7df44f7cb38caba3aa9c3f0497f)) --- CHANGELOG.md | 13 +++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4cfc114..b601c75e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# [1.8.0](https://github.com/amejiarosario/dsa.js/compare/1.7.1...1.8.0) (2020-05-23) + + +### Bug Fixes + +* **book/map:** fix typo on maps space complexity ([2f24f57](https://github.com/amejiarosario/dsa.js/commit/2f24f57f989bb97f198bb32f6daa477d6075dc31)) +* **hashmap:** improve methods documentation ([f6b47b5](https://github.com/amejiarosario/dsa.js/commit/f6b47b5a6c53126bebbad72ac92da1a594042232)) + + +### Features + +* **maps:** implement clear method for hashMap and treeMap ([924c9a7](https://github.com/amejiarosario/dsa.js/commit/924c9a76db91f7df44f7cb38caba3aa9c3f0497f)) + ## [1.7.1](https://github.com/amejiarosario/dsa.js/compare/1.7.0...1.7.1) (2020-05-20) diff --git a/package-lock.json b/package-lock.json index 112761ba..1ad35ece 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.7.1", + "version": "1.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d51fc20b..4295ba82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.7.1", + "version": "1.8.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 3c4ef7555c400828fb89339184294feb7169b215 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 24 May 2020 06:36:45 -0400 Subject: [PATCH 078/200] fix(book/maps): update time/space complexity values --- book/content/part03/map.asc | 4 ++-- book/content/part03/time-complexity-graph-data-structures.asc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/book/content/part03/map.asc b/book/content/part03/map.asc index 44b15eba..b32802fb 100644 --- a/book/content/part03/map.asc +++ b/book/content/part03/map.asc @@ -58,8 +58,8 @@ As we discussed so far, there is a trade-off between the implementations. .2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity ^|_Index/Key_ ^|_Value_ | Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| Hash Map (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| Tree Map (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| Hash Map (optimized) ^|O(1) ^|O(n) ^|O(1)* ^|O(1) ^|O(n) +| Tree Map (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(n) |=== {empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. // end::table[] diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc index 739ef4d1..620171ed 100644 --- a/book/content/part03/time-complexity-graph-data-structures.asc +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -16,8 +16,8 @@ In this section, we learned about Graphs applications, properties and how we can | <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) | <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) | Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> (optimized) ^|O(1)* ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| <> (optimized) ^|O(1) ^|O(n) ^|O(1)* ^|O(1) ^|O(n) +| <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(n) | <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* | <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) |=== From 81c5f0d488380e662f61b650d122039d2e1a1da4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 24 May 2020 10:48:08 +0000 Subject: [PATCH 079/200] :bookmark: chore(release): 1.8.1 ## [1.8.1](https://github.com/amejiarosario/dsa.js/compare/1.8.0...1.8.1) (2020-05-24) ### Bug Fixes * **book/maps:** update time/space complexity values ([3c4ef75](https://github.com/amejiarosario/dsa.js/commit/3c4ef7555c400828fb89339184294feb7169b215)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b601c75e..abeefe6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.8.1](https://github.com/amejiarosario/dsa.js/compare/1.8.0...1.8.1) (2020-05-24) + + +### Bug Fixes + +* **book/maps:** update time/space complexity values ([3c4ef75](https://github.com/amejiarosario/dsa.js/commit/3c4ef7555c400828fb89339184294feb7169b215)) + # [1.8.0](https://github.com/amejiarosario/dsa.js/compare/1.7.1...1.8.0) (2020-05-23) diff --git a/package-lock.json b/package-lock.json index 1ad35ece..5562ab05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.0", + "version": "1.8.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4295ba82..21ca8a75 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.0", + "version": "1.8.1", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 0319b29e92a630c5f14d5e3208b72fe536b38f43 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 24 May 2020 08:47:16 -0400 Subject: [PATCH 080/200] fix(book/hashset): update hashset space complexity --- book/content/part03/set.asc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/content/part03/set.asc b/book/content/part03/set.asc index 04b95a01..cbe6fe60 100644 --- a/book/content/part03/set.asc +++ b/book/content/part03/set.asc @@ -220,8 +220,8 @@ rehash happens, it will take *O(n)* instead of *O(1)*. A `TreeSet` is always *O( |=== .2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity ^|_Index/Key_ ^|_Value_ -| HashSet ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| TreeSet ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| HashSet ^|O(1) ^|- ^|O(1)* ^|O(1) ^|O(n) +| TreeSet ^|O(log n) ^|- ^|O(log n) ^|O(log n) ^|O(n) |=== {empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. // end::table[] From aac8160867a0586d3eb32428eac912e4f9798079 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 24 May 2020 12:57:28 +0000 Subject: [PATCH 081/200] :bookmark: chore(release): 1.8.2 ## [1.8.2](https://github.com/amejiarosario/dsa.js/compare/1.8.1...1.8.2) (2020-05-24) ### Bug Fixes * **book/hashset:** update hashset space complexity ([0319b29](https://github.com/amejiarosario/dsa.js/commit/0319b29e92a630c5f14d5e3208b72fe536b38f43)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abeefe6f..0a985824 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.8.2](https://github.com/amejiarosario/dsa.js/compare/1.8.1...1.8.2) (2020-05-24) + + +### Bug Fixes + +* **book/hashset:** update hashset space complexity ([0319b29](https://github.com/amejiarosario/dsa.js/commit/0319b29e92a630c5f14d5e3208b72fe536b38f43)) + ## [1.8.1](https://github.com/amejiarosario/dsa.js/compare/1.8.0...1.8.1) (2020-05-24) diff --git a/package-lock.json b/package-lock.json index 5562ab05..5b6157d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.1", + "version": "1.8.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 21ca8a75..c1251ebb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.1", + "version": "1.8.2", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 0be0176efc121c5608c1a2df25280d6d9c08e6f3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 24 May 2020 09:02:32 -0400 Subject: [PATCH 082/200] fix(book/maps): update space complexity --- book/content/part03/map.asc | 1 + book/content/part03/set.asc | 1 + book/content/part03/time-complexity-graph-data-structures.asc | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/book/content/part03/map.asc b/book/content/part03/map.asc index b32802fb..11106d4f 100644 --- a/book/content/part03/map.asc +++ b/book/content/part03/map.asc @@ -52,6 +52,7 @@ include::treemap.asc[] As we discussed so far, there is a trade-off between the implementations. (((Tables, Non-Linear DS, HashMap/TreeMap complexities))) +// also on: book/content/part03/time-complexity-graph-data-structures.asc // tag::table[] .Time complexity for different Maps implementations |=== diff --git a/book/content/part03/set.asc b/book/content/part03/set.asc index cbe6fe60..4f02fa61 100644 --- a/book/content/part03/set.asc +++ b/book/content/part03/set.asc @@ -215,6 +215,7 @@ rehash happens, it will take *O(n)* instead of *O(1)*. A `TreeSet` is always *O( (((Tables, Non-Linear DS, HashSet/TreeSet complexities))) +// also on: book/content/part03/time-complexity-graph-data-structures.asc // tag::table[] .Time complexity HashSet vs TreeSet |=== diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc index 620171ed..a62d68c4 100644 --- a/book/content/part03/time-complexity-graph-data-structures.asc +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -18,8 +18,8 @@ In this section, we learned about Graphs applications, properties and how we can | Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) | <> (optimized) ^|O(1) ^|O(n) ^|O(1)* ^|O(1) ^|O(n) | <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(n) -| <> ^|- ^|O(n) ^|O(1)* ^|O(1)* ^|O(1)* -| <> ^|- ^|O(n) ^|O(log n) ^|O(log n) ^|O(log n) +| <> ^|O(1) ^|- ^|O(1)* ^|O(1) ^|O(n) +| <> ^|O(log n) ^|- ^|O(log n) ^|O(log n) ^|O(n) |=== {empty}* = Amortized run time. E.g. rehashing might affect run time to *O(n)*. // end::table[] From f484075b58a2c4109f97a0faa9aeb3090df7727d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 24 May 2020 16:48:50 +0000 Subject: [PATCH 083/200] :bookmark: chore(release): 1.8.3 ## [1.8.3](https://github.com/amejiarosario/dsa.js/compare/1.8.2...1.8.3) (2020-05-24) ### Bug Fixes * **book/maps:** update space complexity ([0be0176](https://github.com/amejiarosario/dsa.js/commit/0be0176efc121c5608c1a2df25280d6d9c08e6f3)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a985824..09ba1001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.8.3](https://github.com/amejiarosario/dsa.js/compare/1.8.2...1.8.3) (2020-05-24) + + +### Bug Fixes + +* **book/maps:** update space complexity ([0be0176](https://github.com/amejiarosario/dsa.js/commit/0be0176efc121c5608c1a2df25280d6d9c08e6f3)) + ## [1.8.2](https://github.com/amejiarosario/dsa.js/compare/1.8.1...1.8.2) (2020-05-24) diff --git a/package-lock.json b/package-lock.json index 5b6157d7..734ae1f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.2", + "version": "1.8.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c1251ebb..f27525a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.2", + "version": "1.8.3", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 288ff77b2386f6d401421f47d39618e924bf86da Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 25 May 2020 19:40:12 -0400 Subject: [PATCH 084/200] chore(book-quicksort): update time complexities --- book/content/part04/sorting-algorithms.asc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 09135bc8..31d2f4f0 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -135,8 +135,7 @@ We explored many algorithms some of them simple and other more performant. Also, | <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes | <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No | <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No -| <> | O(n log n) | O(n^2^) | O(n log n) | O(log n) | Yes | Yes | No | No +| <> | O(n log n) | O(n log n) | O(n^2^) | O(log n) | No | Yes | No | No // | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes |=== // end::table[] - From 75f8d117ebb023b14419a4ae5912396d48b3b78a Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 25 May 2020 19:42:22 -0400 Subject: [PATCH 085/200] chore(benchmarks): new files for benchmarks --- .../two-sum-implementations/01-two-sum.js | 13 +++++++++++++ .../two-sum-implementations/02-two-sum.js | 19 +++++++++++++++++++ .../two-sum-implementations/03-two-sum.js | 18 ++++++++++++++++++ benchmarks/two-sum-implementations/runner.js | 16 ++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 benchmarks/two-sum-implementations/01-two-sum.js create mode 100644 benchmarks/two-sum-implementations/02-two-sum.js create mode 100644 benchmarks/two-sum-implementations/03-two-sum.js create mode 100644 benchmarks/two-sum-implementations/runner.js diff --git a/benchmarks/two-sum-implementations/01-two-sum.js b/benchmarks/two-sum-implementations/01-two-sum.js new file mode 100644 index 00000000..820df298 --- /dev/null +++ b/benchmarks/two-sum-implementations/01-two-sum.js @@ -0,0 +1,13 @@ +// Brute force: O(n^2) | O(1) +function twoSum(nums, target) { + for (let i = 0; i < nums.length - 1; i++) { // O(n^2) + for (let j = i + 1; j < nums.length; j++) { // O(n) + if (nums[i] + nums[j] === target) { + return [i, j]; + } + } + } + return []; +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/02-two-sum.js b/benchmarks/two-sum-implementations/02-two-sum.js new file mode 100644 index 00000000..9703e670 --- /dev/null +++ b/benchmarks/two-sum-implementations/02-two-sum.js @@ -0,0 +1,19 @@ +// With a HashMap: O(n) | O(n) +function twoSum(nums, target) { + const map = nums.reduce((m, v, i) => { // O(n) + const ids = m.get(v) || []; + ids.push(i); + return m.set(v, ids); + }, new Map()); + + for (let i = 0; i < nums.length; i++) { // O(n) + const diff = target - nums[i]; + if (map.has(diff) && i !== map.get(diff)) { + return [i, map.get(diff)]; + } + } + + return []; +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/03-two-sum.js b/benchmarks/two-sum-implementations/03-two-sum.js new file mode 100644 index 00000000..8670622f --- /dev/null +++ b/benchmarks/two-sum-implementations/03-two-sum.js @@ -0,0 +1,18 @@ +// With a HashMap: O(n) | O(n), 1-pass +function twoSum(nums, target) { + const map = new Map(); + + for (let i = 0; i < nums.length; i++) { // O(n) + const complement = target - nums[i]; + + if (map.has(complement)) { + return [map.get(complement), i]; + } + + map.set(nums[i], i); + } + + return []; +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/runner.js b/benchmarks/two-sum-implementations/runner.js new file mode 100644 index 00000000..2bd280a1 --- /dev/null +++ b/benchmarks/two-sum-implementations/runner.js @@ -0,0 +1,16 @@ +const assert = require('assert'); + +const twoSum = require('./01-two-sum'); + +function test() { + assert.deepEqual(twoSum([1, 2, 3], 4), [0, 2]); + assert.deepEqual(twoSum([1, 2, 3], 14), []); + + assert.deepEqual(twoSum([2, 2, 2], 4), [0, 1]); + assert.deepEqual(twoSum(Array(1e7).fill(2), 4), [0, 1]); // + // assert.deepEqual(twoSum(Array(1e8).fill(2), 4), [0, 1]); // FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory + // assert.deepEqual(twoSum(Array(1e9).fill(2), 4), [0, 1]); // 1e7 - error 137 - OUT OF MEMORY + console.log('All tests passed!'); +} + +test(); From f3fe049b266c015145eaf33cc913e9a4ea4032c9 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 25 May 2020 19:59:49 -0400 Subject: [PATCH 086/200] chore(book/sorting): fix bubble sort reference --- book/content/part04/bubble-sort.asc | 1 + book/content/part04/quick-sort.asc | 4 ++-- book/content/part04/sorting-algorithms.asc | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/book/content/part04/bubble-sort.asc b/book/content/part04/bubble-sort.asc index ed146f7d..583d8415 100644 --- a/book/content/part04/bubble-sort.asc +++ b/book/content/part04/bubble-sort.asc @@ -3,6 +3,7 @@ ifndef::imagesdir[] :codedir: ../../../src endif::[] +[[bubble-sort]] ==== Bubble Sort (((Bubble Sort))) (((Sorting, Bubble Sort))) diff --git a/book/content/part04/quick-sort.asc b/book/content/part04/quick-sort.asc index ad2dfdbb..314caad8 100644 --- a/book/content/part04/quick-sort.asc +++ b/book/content/part04/quick-sort.asc @@ -83,11 +83,11 @@ With the optimization, Quicksort has an _O(n log n)_ running time. Similar to th - <>: [big]#️❌# No, the pivot element can be choose at random. - Recursive: Yes - Time Complexity: [big]#✅# <> _O(n log n)_ -- Space Complexity: [big]#✅# <> _O(1)_ +- Space Complexity: [big]#✅# <> _O(log n)_, because of recursion. (((Linearithmic))) (((Runtime, Linearithmic))) -(((Space complexity, Constant))) +(((Space complexity, Logarithmic))) // Resources: // https://www.khanacademy.org/computing/computer-science/algorithms/quick-sort/a/linear-time-partitioning diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 31d2f4f0..67ea34a4 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -9,7 +9,7 @@ Sorting is one of the most common solutions when we want to extract some insight We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. .We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: -- <> +- <> - <> - <> @@ -120,7 +120,7 @@ We explored many algorithms some of them simple and other more performant. Also, [cols="20,80"] |=== | Algorithms | Comments -| <> | Swap pairs bubbling up largest numbers to the right +| <> | Swap pairs bubbling up largest numbers to the right | <> | Look for biggest number to the left and swap it with current | <> | Iterate array looking for smallest value to the right | <> | Split numbers in pairs, sort pairs and join them in ascending order @@ -131,11 +131,11 @@ We explored many algorithms some of them simple and other more performant. Also, .Sorting algorithms time/space complexity and properties |=== | Algorithms | Avg | Best | Worst | Space | Stable | In-place | Online | Adaptive -| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes +| <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes | <> | O(n^2^) | O(n) | O(n^2^) | O(1) | Yes | Yes | Yes | Yes | <> | O(n^2^) | O(n^2^) | O(n^2^) | O(1) | No | Yes | No | No | <> | O(n log n) | O(n log n) | O(n log n) | O(n) | Yes | No | No | No -| <> | O(n log n) | O(n log n) | O(n^2^) | O(log n) | No | Yes | No | No +| <> | O(n log n) | O(n log n) | O(n^2^) | O(log n) | No | Yes | No | No // | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes |=== // end::table[] From 1fa875fd772eb4a45dd9690bea593b513687caca Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 30 Jun 2020 07:18:56 -0400 Subject: [PATCH 087/200] feat(linkedList): takes iterables in the constructor --- src/data-structures/linked-lists/linked-list.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data-structures/linked-lists/linked-list.js b/src/data-structures/linked-lists/linked-list.js index b33a7707..68d35821 100644 --- a/src/data-structures/linked-lists/linked-list.js +++ b/src/data-structures/linked-lists/linked-list.js @@ -7,10 +7,12 @@ const Node = require('./node'); * the last and first element */ class LinkedList { - constructor() { + constructor(iterable = []) { this.first = null; // head/root element this.last = null; // last element of the list this.size = 0; // total number of elements in the list + + Array.from(iterable, (i) => this.addLast(i)); } // end::constructor[] From 6af937fb380ffcd26558193c1626bdb84b2abe17 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 30 Jun 2020 07:19:30 -0400 Subject: [PATCH 088/200] feat(heap): remove by index --- src/data-structures/heaps/heap.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/data-structures/heaps/heap.js b/src/data-structures/heaps/heap.js index 423f5663..459985dc 100644 --- a/src/data-structures/heaps/heap.js +++ b/src/data-structures/heaps/heap.js @@ -33,11 +33,11 @@ class Heap { * Retrieves and removes the head of this heap, or returns null if this heap is empty. * @runtime O(log n) */ - remove() { + remove(index = 0) { if (!this.size()) return null; - this.swap(0, this.size() - 1); - const value = this.array.pop(); - this.bubbleDown(); + this.swap(index, this.size() - 1); // swap with last + const value = this.array.pop(); // remove element + this.bubbleDown(index); return value; } @@ -66,17 +66,17 @@ class Heap { * After removal, moves element downwards on the heap, if it's out of order * @runtime O(log n) */ - bubbleDown() { - let index = 0; + bubbleDown(index = 0) { + let curr = index; const left = (i) => 2 * i + 1; const right = (i) => 2 * i + 2; const getTopChild = (i) => (right(i) < this.size() && this.comparator(left(i), right(i)) > 0 ? right(i) : left(i)); - while (left(index) < this.size() && this.comparator(index, getTopChild(index)) > 0) { - const next = getTopChild(index); - this.swap(index, next); - index = next; + while (left(curr) < this.size() && this.comparator(curr, getTopChild(curr)) > 0) { + const next = getTopChild(curr); + this.swap(curr, next); + curr = next; } } From a93ac1bdb0a88d9f5ae413a6a6b2ddb4f7afa193 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 30 Jun 2020 07:21:59 -0400 Subject: [PATCH 089/200] chore(lab): add exercises --- .../01-array-rotation.js | 9 ++ .../01a-array-rotation.js | 11 ++ .../02-array-rotation.js | 12 ++ .../array-rotation.spec.js | 17 +++ .../two-sum-implementations/01a-two-sum.js | 13 ++ .../two-sum-implementations/02-two-sum.js | 7 +- .../two-sum-implementations/02a-two-sum.js | 24 +++ .../two-sum-implementations/04-two-sum.js | 23 +++ .../two-sum-implementations/two-sum.spec.js | 23 +++ lab/exercises/10-mixed/check-prerequisite.js | 33 +++++ .../10-mixed/check-prerequisite.spec.js | 140 ++++++++++++++++++ .../10-mixed/linked-list-data-equality.js | 49 ++++++ .../linked-list-data-equality.spec.js | 40 +++++ lab/exercises/10-mixed/maze.js | 45 ++++++ lab/exercises/10-mixed/maze.spec.js | 24 +++ 15 files changed, 467 insertions(+), 3 deletions(-) create mode 100644 benchmarks/array-rotation-implementations/01-array-rotation.js create mode 100644 benchmarks/array-rotation-implementations/01a-array-rotation.js create mode 100644 benchmarks/array-rotation-implementations/02-array-rotation.js create mode 100644 benchmarks/array-rotation-implementations/array-rotation.spec.js create mode 100644 benchmarks/two-sum-implementations/01a-two-sum.js create mode 100644 benchmarks/two-sum-implementations/02a-two-sum.js create mode 100644 benchmarks/two-sum-implementations/04-two-sum.js create mode 100644 benchmarks/two-sum-implementations/two-sum.spec.js create mode 100644 lab/exercises/10-mixed/check-prerequisite.js create mode 100644 lab/exercises/10-mixed/check-prerequisite.spec.js create mode 100644 lab/exercises/10-mixed/linked-list-data-equality.js create mode 100644 lab/exercises/10-mixed/linked-list-data-equality.spec.js create mode 100644 lab/exercises/10-mixed/maze.js create mode 100644 lab/exercises/10-mixed/maze.spec.js diff --git a/benchmarks/array-rotation-implementations/01-array-rotation.js b/benchmarks/array-rotation-implementations/01-array-rotation.js new file mode 100644 index 00000000..907357fd --- /dev/null +++ b/benchmarks/array-rotation-implementations/01-array-rotation.js @@ -0,0 +1,9 @@ +// brute force: O(nd) | O(1) +function rotLeft(a, d) { + for (let i = 0; i < d; i++) { // O(d) + a.push(a.shift()); // O(n), shift O(n) + } + return a; +} + +module.exports = rotLeft; diff --git a/benchmarks/array-rotation-implementations/01a-array-rotation.js b/benchmarks/array-rotation-implementations/01a-array-rotation.js new file mode 100644 index 00000000..2053166f --- /dev/null +++ b/benchmarks/array-rotation-implementations/01a-array-rotation.js @@ -0,0 +1,11 @@ +// modulus for rotations: O(n^2) | O(1) +function rotLeft(a, d) { + const len = a.length; + const rot = d % len; + for (let i = 0; i < rot; i++) { // O(n^2) + a.push(a.shift()); // O(n) + } + return a; +} + +module.exports = rotLeft; diff --git a/benchmarks/array-rotation-implementations/02-array-rotation.js b/benchmarks/array-rotation-implementations/02-array-rotation.js new file mode 100644 index 00000000..321d545e --- /dev/null +++ b/benchmarks/array-rotation-implementations/02-array-rotation.js @@ -0,0 +1,12 @@ +// additional space: O(n) | O(n) +function rotLeft(a, d) { + const len = a.length; + const rot = d % len; + const b = []; + for (let i = 0; i < len; i++) { // O(n) + b[i] = a[(rot + i) % len]; // O(1) + } + return b; +} + +module.exports = rotLeft; diff --git a/benchmarks/array-rotation-implementations/array-rotation.spec.js b/benchmarks/array-rotation-implementations/array-rotation.spec.js new file mode 100644 index 00000000..2ff3b80c --- /dev/null +++ b/benchmarks/array-rotation-implementations/array-rotation.spec.js @@ -0,0 +1,17 @@ +/*eslint-disable */ +// npx jest benchmarks/two-sum-implementations/two-sum.spec.js --watch --collectCoverage +const implementations = [ + { name: 1, fn: require('./01-array-rotation') }, + { name: '1a', fn: require('./01a-array-rotation') }, + { name: 2, fn: require('./02-array-rotation') }, +]; + +implementations.forEach(({name, fn}) => { + describe(`Two Sum: ${name}`, () => { + it('should work on worst case', () => { + const rots = 1000; + const array = [1, 2, 3]; + expect(fn(array, rots)).toEqual([2,3,1]); + }); + }); +}); diff --git a/benchmarks/two-sum-implementations/01a-two-sum.js b/benchmarks/two-sum-implementations/01a-two-sum.js new file mode 100644 index 00000000..47d10818 --- /dev/null +++ b/benchmarks/two-sum-implementations/01a-two-sum.js @@ -0,0 +1,13 @@ +// Brute force: O(n^2) | O(1) +function twoSum(nums, target) { + for (let i = 0; i < nums.length - 1; i++) { // O(n^2) + const diff = target - nums[i]; + const offset = i + 1; + const idx = nums.slice(offset).findIndex((n) => n === diff); // O(n) + const j = offset + idx; + if (idx > -1) return [i, j]; + } + return []; +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/02-two-sum.js b/benchmarks/two-sum-implementations/02-two-sum.js index 9703e670..602d37d7 100644 --- a/benchmarks/two-sum-implementations/02-two-sum.js +++ b/benchmarks/two-sum-implementations/02-two-sum.js @@ -1,4 +1,4 @@ -// With a HashMap: O(n) | O(n) +// [map w/dups handling] → O(n^2) | O(n) function twoSum(nums, target) { const map = nums.reduce((m, v, i) => { // O(n) const ids = m.get(v) || []; @@ -8,8 +8,9 @@ function twoSum(nums, target) { for (let i = 0; i < nums.length; i++) { // O(n) const diff = target - nums[i]; - if (map.has(diff) && i !== map.get(diff)) { - return [i, map.get(diff)]; + if (map.has(diff)) { + const id = map.get(diff).find((j) => j > i); + if (id > -1) return [i, id]; } } diff --git a/benchmarks/two-sum-implementations/02a-two-sum.js b/benchmarks/two-sum-implementations/02a-two-sum.js new file mode 100644 index 00000000..68b411d5 --- /dev/null +++ b/benchmarks/two-sum-implementations/02a-two-sum.js @@ -0,0 +1,24 @@ +// [map w/dups handling] → O(n^2) | O(n) +function twoSum(nums, target) { + const map = mapify(nums); + + for (let i = 0; i < nums.length; i++) { // O(n) + const diff = target - nums[i]; + if (map.has(diff)) { + const id = map.get(diff).find((j) => j > i); + if (id > -1) return [i, id]; + } + } + + return []; +} + +function mapify(nums) { + return nums.reduce((m, v, i) => { // O(n) + const ids = m.get(v) || []; + ids.push(i); + return m.set(v, ids); + }, new Map()); +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/04-two-sum.js b/benchmarks/two-sum-implementations/04-two-sum.js new file mode 100644 index 00000000..45b0f7c9 --- /dev/null +++ b/benchmarks/two-sum-implementations/04-two-sum.js @@ -0,0 +1,23 @@ +// sort + two pointers: O(n log n) | O(1) +function twoSum(nums, target) { + nums.sort((a, b) => a - b); + + let lo = 0; + let hi = nums.length - 1; + + while (lo < hi) { + const sum = nums[lo] + nums[hi]; + if (sum === target) { + return [lo, hi]; + } + + if (sum > target) { + hi--; + } else { + lo++; + } + } + return []; +} + +module.exports = twoSum; diff --git a/benchmarks/two-sum-implementations/two-sum.spec.js b/benchmarks/two-sum-implementations/two-sum.spec.js new file mode 100644 index 00000000..c7f5fefb --- /dev/null +++ b/benchmarks/two-sum-implementations/two-sum.spec.js @@ -0,0 +1,23 @@ +/*eslint-disable */ +// npx jest benchmarks/two-sum-implementations/two-sum.spec.js --watch --collectCoverage +const implementations = [ + { name: 1, fn: require('./01-two-sum') }, + { name: '1a', fn: require('./01a-two-sum') }, + { name: 2, fn: require('./02-two-sum') }, + { name: '2a', fn: require('./02a-two-sum') }, + { name: 3, fn: require('./03-two-sum') }, + { name: 4, fn: require('./04-two-sum') }, +]; + +implementations.forEach(({name, fn}) => { + describe(`Two Sum: ${name}`, () => { + xit('should work', () => { + expect(fn([1, 2, 3].concat(Array(1e2 - 3).fill(7)), 4)).toEqual([0, 2]); + }); + + it('should work on worst case', () => { + const size = 100; + expect(fn([...Array(size).fill(2), 3, 3 * size * 10], 3 * size * 10 + 3)).toEqual([size, size + 1]); + }); + }); +}); diff --git a/lab/exercises/10-mixed/check-prerequisite.js b/lab/exercises/10-mixed/check-prerequisite.js new file mode 100644 index 00000000..d80ad176 --- /dev/null +++ b/lab/exercises/10-mixed/check-prerequisite.js @@ -0,0 +1,33 @@ +const checkIfPrerequisite = function (n, prerequisites, queries) { + const graph = new Map(); + + Array(n).fill(0).forEach((v, i) => graph.set(i, { + children: [], + // connected: new Set(), + })); + + prerequisites.forEach(([u, v]) => { + graph.get(u).children.push(v); + // graph.get(u).connected.add(v); + }); + + + return queries.map(([u, v]) => isConnected(graph, u, v, new Set(), u)); +}; + +function isConnected(graph, u, v, path = new Set(), p) { + // console.log({u, v, path}, graph) + // if (graph.get(u).connected.has(v)) return true; + // path.forEach(s => graph.get(p).connected.add(s)); + + for (const child of graph.get(u).children) { + if (child === v) return true; + if (path.has(child)) continue; + if (isConnected(graph, child, v, path.add(u), p)) return true; + } + + return false; +} + + +module.exports = checkIfPrerequisite; diff --git a/lab/exercises/10-mixed/check-prerequisite.spec.js b/lab/exercises/10-mixed/check-prerequisite.spec.js new file mode 100644 index 00000000..4614161a --- /dev/null +++ b/lab/exercises/10-mixed/check-prerequisite.spec.js @@ -0,0 +1,140 @@ +const checkIfPrerequisite = require('./check-prerequisite'); + +describe('checkIfPrerequisite', () => { + it('should work with 2', () => { + const n = 2; + const prerequisites = [[1, 0]]; + const queries = [ + [0, 1], + [1, 0], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + false, + true, + ]); + }); + + it('example 4', () => { + const n = 3; + const prerequisites = [ + [1, 0], + [2, 0], + ]; + const queries = [ + [0, 1], + [2, 0], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + false, + true, + ]); + }); + + it('example 5', () => { + const n = 5; + const prerequisites = [ + [0, 1], + [1, 2], + [2, 3], + [3, 4], + ]; + const queries = [ + [0, 4], + [4, 0], + [1, 3], + [3, 0], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + true, + false, + true, + false, + ]); + }); + + it('no prereq', () => { + const n = 2; + const prerequisites = []; + const queries = [ + [1, 0], + [0, 1], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + false, + false, + ]); + }); + + it('example 3', () => { + const n = 3; + const prerequisites = [ + [1, 2], + [1, 0], + [2, 0], + ]; + const queries = [ + [1, 0], + [1, 2], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + true, + true, + ]); + }); + + it('should work with inferred', () => { + const n = 3; + const prerequisites = [ + [0, 1], + [1, 2], + ]; + const queries = [ + [0, 1], + [1, 2], + [0, 2], + [2, 1], + [2, 0], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + true, + true, + true, + false, + false, + ]); + }); + + it('should work with 4', () => { + const n = 4; + const prerequisites = [ + [2, 3], + [2, 1], + [0, 3], + [0, 1], + ]; + // https://bit.ly/2ApKE3L + const queries = [ + [0, 1], + [0, 3], + [2, 3], + [3, 0], + [2, 0], + [0, 2], + ]; + expect(checkIfPrerequisite(n, prerequisites, queries)).toEqual([ + true, + true, + true, + false, + false, + false, + ]); + }); + + it('stress testing', () => { + const n = 33; + const prerequisites = [[16,22],[16,15],[16,2],[16,3],[16,25],[16,21],[16,11],[16,23],[16,5],[16,13],[16,20],[16,29],[16,14],[16,9],[16,17],[16,6],[16,27],[16,8],[16,24],[16,1],[16,31],[16,7],[16,18],[16,26],[16,30],[16,28],[16,10],[16,12],[32,22],[32,15],[32,2],[32,25],[32,21],[32,11],[32,23],[32,5],[32,4],[32,20],[32,29],[32,14],[32,17],[32,19],[32,6],[32,27],[32,8],[32,24],[32,1],[32,31],[32,7],[32,18],[32,26],[32,30],[32,28],[32,10],[32,12],[32,0],[22,15],[22,2],[22,3],[22,21],[22,11],[22,23],[22,5],[22,4],[22,13],[22,20],[22,29],[22,9],[22,17],[22,19],[22,6],[22,8],[22,24],[22,31],[22,7],[22,18],[22,26],[22,30],[22,28],[22,10],[22,12],[22,0],[15,2],[15,3],[15,25],[15,21],[15,11],[15,23],[15,5],[15,4],[15,13],[15,29],[15,14],[15,9],[15,17],[15,19],[15,6],[15,27],[15,8],[15,24],[15,1],[15,31],[15,7],[15,18],[15,26],[15,30],[15,28],[15,10],[15,12],[15,0],[2,25],[2,21],[2,11],[2,23],[2,5],[2,4],[2,13],[2,29],[2,14],[2,9],[2,17],[2,19],[2,6],[2,27],[2,8],[2,24],[2,1],[2,31],[2,7],[2,18],[2,10],[2,12],[2,0],[3,25],[3,21],[3,11],[3,23],[3,5],[3,4],[3,13],[3,20],[3,29],[3,14],[3,9],[3,17],[3,6],[3,8],[3,1],[3,31],[3,7],[3,18],[3,26],[3,30],[3,10],[3,12],[3,0],[25,21],[25,11],[25,23],[25,5],[25,4],[25,20],[25,29],[25,14],[25,9],[25,17],[25,19],[25,6],[25,27],[25,8],[25,24],[25,1],[25,31],[25,7],[25,18],[25,26],[25,30],[25,28],[25,10],[25,12],[21,11],[21,23],[21,5],[21,4],[21,13],[21,20],[21,29],[21,14],[21,9],[21,19],[21,6],[21,27],[21,8],[21,24],[21,1],[21,31],[21,7],[21,18],[21,26],[21,30],[21,28],[21,10],[21,12],[21,0],[11,23],[11,5],[11,4],[11,13],[11,20],[11,29],[11,14],[11,9],[11,17],[11,19],[11,6],[11,27],[11,8],[11,24],[11,1],[11,31],[11,7],[11,18],[11,26],[11,30],[11,28],[11,10],[11,12],[11,0],[23,5],[23,4],[23,13],[23,20],[23,29],[23,14],[23,9],[23,17],[23,6],[23,8],[23,24],[23,1],[23,7],[23,18],[23,28],[23,10],[23,12],[5,13],[5,20],[5,9],[5,17],[5,6],[5,27],[5,24],[5,1],[5,31],[5,7],[5,18],[5,26],[5,30],[5,10],[5,12],[5,0],[4,13],[4,20],[4,29],[4,14],[4,17],[4,19],[4,6],[4,8],[4,24],[4,1],[4,31],[4,7],[4,18],[4,26],[4,30],[4,28],[4,10],[4,12],[4,0],[13,20],[13,14],[13,9],[13,17],[13,19],[13,8],[13,24],[13,1],[13,31],[13,7],[13,18],[13,26],[13,30],[13,28],[13,10],[13,12],[13,0],[20,29],[20,14],[20,9],[20,17],[20,19],[20,6],[20,27],[20,1],[20,31],[20,26],[20,30],[20,28],[20,12],[20,0],[29,14],[29,9],[29,17],[29,19],[29,6],[29,27],[29,8],[29,24],[29,1],[29,31],[29,7],[29,18],[29,30],[29,28],[29,10],[29,12],[29,0],[14,9],[14,17],[14,19],[14,6],[14,27],[14,24],[14,1],[14,31],[14,7],[14,18],[14,26],[14,30],[14,28],[14,12],[14,0],[9,17],[9,19],[9,6],[9,27],[9,8],[9,24],[9,1],[9,31],[9,7],[9,18],[9,26],[9,30],[9,28],[9,12],[9,0],[17,19],[17,6],[17,27],[17,8],[17,24],[17,1],[17,7],[17,18],[17,26],[17,30],[17,28],[17,10],[17,12],[17,0],[19,6],[19,8],[19,24],[19,1],[19,31],[19,7],[19,18],[19,26],[19,30],[19,28],[19,10],[19,0],[6,27],[6,8],[6,24],[6,1],[6,7],[6,26],[6,30],[6,28],[6,10],[6,12],[6,0],[27,8],[27,24],[27,1],[27,7],[27,26],[27,30],[27,28],[27,10],[27,12],[27,0],[8,24],[8,1],[8,31],[8,18],[8,26],[8,28],[8,12],[8,0],[24,1],[24,31],[24,7],[24,18],[24,26],[24,30],[24,28],[24,12],[24,0],[1,31],[1,7],[1,18],[1,26],[1,30],[1,28],[1,10],[1,12],[1,0],[31,7],[31,18],[31,26],[31,30],[31,28],[31,10],[31,12],[31,0],[7,18],[7,26],[7,30],[7,28],[7,10],[18,26],[18,28],[18,10],[26,30],[26,28],[26,10],[26,0],[30,28],[30,10],[30,12],[30,0],[28,12],[28,0],[10,0],[12,0]]; + const queries = [[6,17],[31,23],[32,18],[31,18],[23,8],[30,20],[13,16],[25,31],[30,22],[17,0],[10,26],[32,20],[10,28],[31,32],[32,21],[24,27],[17,10],[27,3],[24,16],[31,29],[6,31],[23,22],[24,13],[7,21],[14,28],[28,30],[28,32],[16,7],[7,32],[10,24],[5,28],[20,32],[27,31],[31,32],[30,32],[4,10],[18,32],[18,22],[10,25],[32,22],[0,32],[32,27],[32,25],[18,12],[24,23],[30,31],[28,18],[18,26],[18,20],[30,16],[7,19],[29,31],[13,10],[18,7],[14,2],[32,30],[14,1],[27,29],[13,22],[25,1],[25,23],[8,29],[16,20],[10,24],[4,20],[0,13],[25,14],[29,27],[12,28],[24,31],[32,26],[29,3],[27,23],[22,31],[21,15],[29,11],[30,26],[18,25],[22,29],[10,26],[20,12],[6,1],[30,7],[4,31],[13,16],[30,18],[13,5],[16,25],[23,28],[28,25],[30,10],[16,21],[32,5],[19,16],[30,29],[2,16],[18,21],[20,24],[24,23],[13,7],[28,5],[32,31],[17,24],[6,29],[24,25],[21,24],[24,22],[26,29],[20,5],[22,29],[19,9],[16,21],[21,18],[2,11],[14,0],[14,7],[17,23],[31,1],[3,9],[22,4],[30,21],[32,11],[31,28],[26,29],[19,0],[22,13],[4,17],[1,2],[29,24],[14,15],[19,0],[6,25],[14,27],[20,31],[25,21],[32,31],[31,27],[6,14],[32,30],[22,20],[27,20],[23,22],[28,31],[15,26],[26,14],[28,7],[29,30],[32,28],[15,26],[14,27],[32,31],[6,23],[8,27],[5,7],[21,18],[14,11],[32,28],[29,8],[24,32],[14,28],[19,21],[15,13],[3,20],[30,27],[22,19],[32,29],[6,10],[26,30],[29,4],[16,3],[31,8],[20,24],[30,8],[17,28],[13,14],[4,10],[12,22],[26,3],[30,28],[3,8],[11,30],[20,4],[20,14],[15,27],[15,23],[27,25],[4,20],[7,31],[24,22],[28,29],[21,31],[32,11],[19,10],[30,25],[8,24],[26,17],[9,26],[17,14],[29,24],[30,31],[29,22],[10,21],[21,19],[25,28],[15,28],[32,29],[23,1],[26,29],[17,31],[25,21],[15,8],[29,28],[20,24],[19,24],[23,22],[2,15],[17,31],[31,32],[23,21],[27,31],[28,24],[2,21],[4,26],[27,20],[14,25],[4,3],[21,22],[28,22],[16,26],[12,22],[27,9],[8,30],[24,30],[23,28],[14,3],[1,7],[32,31],[23,29],[23,29],[11,20],[30,27],[20,7],[31,27],[2,30],[6,11],[18,10],[13,31],[19,31],[24,9],[7,10],[27,31],[3,4],[24,2],[8,21],[13,27],[23,20],[26,25],[18,30],[26,23],[20,29],[32,27],[29,14],[29,27],[6,27],[17,0],[29,30],[31,28],[24,29],[23,0],[31,23],[23,26],[21,14],[16,7],[28,12],[3,7],[3,30],[31,29],[15,0],[13,6],[32,12],[28,26],[27,30],[23,29],[5,13],[29,30],[14,22],[9,22],[16,13],[31,28],[30,13],[14,21],[32,31],[10,21],[27,24],[11,4],[13,1],[21,24],[31,32],[12,3],[29,32],[15,14],[9,26],[25,21],[32,31],[11,23],[18,11],[18,21],[24,1],[31,18],[26,20],[19,6],[25,10],[21,28],[23,32],[28,30],[31,30],[6,16],[19,29],[13,23],[31,30],[29,25],[32,19],[26,23],[2,3],[22,24],[32,29],[24,27],[30,8],[31,30],[24,13],[31,32],[26,30],[27,10],[26,5],[10,22],[27,32],[17,14],[26,18],[32,31],[10,5],[0,19],[28,30],[13,7],[9,28],[20,19],[4,23],[30,31],[26,21],[25,24],[23,22],[26,29],[22,17],[18,20],[18,31],[11,16],[0,23],[9,6],[17,19],[1,4],[18,27],[20,30],[16,19],[25,23],[32,29],[32,30],[18,3],[2,21],[0,5],[18,16],[11,1],[28,16],[31,10],[32,14],[13,32],[20,22],[25,23],[14,21],[14,26],[14,3],[18,5],[28,24],[4,19],[2,16],[24,16],[21,19],[32,25],[30,23],[12,8],[11,17],[13,5],[23,16],[28,22],[10,29],[10,15],[29,6],[18,10],[26,30],[31,21],[23,2],[27,20],[32,17],[1,16],[32,30],[22,12],[17,0],[4,6],[31,29],[30,32],[18,28],[32,28],[16,28],[19,25],[31,32],[25,31],[19,21],[12,9],[18,32],[17,10],[21,9],[0,16],[16,23],[10,30],[31,19],[30,19],[26,12],[24,25],[17,32],[23,22],[6,23],[14,28],[5,14],[25,29],[28,24],[8,3],[30,19],[26,7],[11,17],[32,29],[26,28],[14,23],[30,25],[25,31],[31,4],[11,9],[30,19],[19,2],[11,9],[21,28],[13,10],[19,6],[1,19],[24,15],[23,25],[16,30],[9,26],[28,0],[21,24],[19,3],[26,6],[11,21],[17,21],[16,21],[1,31],[15,16],[31,32],[30,8],[6,7],[23,14],[19,22],[31,32],[23,20],[17,30],[4,3],[17,1],[32,25],[10,31],[11,12],[26,28],[25,28],[31,23],[18,16],[16,14],[2,8],[1,14],[10,19],[26,8],[16,7],[25,18],[16,10],[19,27],[30,31],[29,21],[29,28],[17,30],[10,24],[16,0],[32,31],[32,31],[8,1],[23,11],[25,28],[20,14],[16,10],[10,0],[22,32],[15,9],[19,14],[27,25],[27,25],[31,32],[13,30],[9,31],[15,26],[15,28],[0,25],[30,22],[7,24],[10,28],[22,23],[16,28],[8,9],[31,17],[19,25],[23,6],[29,32],[4,5],[21,5],[27,23],[31,30],[29,30],[24,25],[20,30],[27,18],[21,9],[32,30],[23,5],[17,5],[20,18],[19,12],[32,28],[21,17],[32,20],[26,13],[28,25],[31,32],[19,29],[29,14],[24,15],[30,4],[14,20],[27,22],[4,16],[9,22],[18,5],[31,13],[26,29],[30,32],[27,30],[0,8],[17,1],[30,32],[18,19],[25,22],[23,17],[24,26],[8,10],[20,23],[32,31],[32,20],[22,9],[0,15],[19,18],[32,29],[22,1],[19,22],[13,23],[31,32],[20,3],[29,8],[27,29],[7,17],[16,20],[24,4],[30,32],[28,12],[32,31],[31,30],[6,18],[32,30],[11,6],[28,29],[21,31],[2,21],[9,30],[31,32],[13,21],[31,14],[22,30],[32,26],[11,30],[9,19],[10,20],[29,10],[1,20],[25,30],[13,20],[15,16],[27,28],[29,22],[13,3],[7,17],[12,14],[32,31],[18,15],[31,28],[25,31],[30,31],[29,2],[26,19],[31,24],[22,3],[32,31],[23,28],[2,24],[4,8],[19,5],[16,29],[7,13],[10,28],[12,9],[23,28],[14,27],[31,24],[14,3],[26,31],[23,32],[14,31],[14,18],[0,10],[23,13],[25,24],[17,7],[17,11],[19,2],[32,16],[9,15],[25,17],[12,3],[32,26],[12,20],[29,11],[29,32],[5,7],[23,25],[27,22],[31,32],[30,22],[30,31],[9,10],[28,29],[5,3],[8,24],[28,32],[14,22],[7,28],[30,20],[20,9],[32,31],[23,31],[31,29],[32,30],[24,32],[1,2],[20,4],[1,21],[31,15],[26,27],[10,24],[1,25],[23,20],[20,22],[9,29],[25,24],[17,9],[17,9],[13,32],[21,20],[29,20],[19,7],[28,30],[12,28],[21,28],[12,16],[14,11],[6,27],[31,23],[10,15],[28,7],[0,5],[19,17],[25,11],[7,16],[32,30],[32,30],[12,31],[11,12],[31,28],[27,32],[14,1],[17,5],[15,25],[8,19],[29,31],[14,27],[18,20],[7,3],[9,6],[20,24],[9,27],[1,11],[20,4],[12,30],[21,7],[28,3],[32,30],[11,0],[29,27],[31,32],[11,9],[24,0],[24,14],[21,3],[13,30],[25,32],[21,24],[7,8],[19,22],[21,20],[11,4],[5,4],[9,17],[31,26],[26,18],[25,21],[19,17],[7,4],[5,17],[2,4],[20,16],[13,20],[31,32],[29,24],[3,24],[10,23],[9,16],[18,17],[21,26],[27,29],[31,32],[24,2],[15,26],[1,8],[14,20],[31,32],[21,14],[32,23],[31,25],[31,17],[15,13],[22,32],[27,21],[32,10],[26,28],[27,29],[12,29],[6,16],[14,19],[17,21],[23,27],[1,12],[14,26],[22,21],[0,12],[10,9],[13,18],[20,23],[27,28],[11,15],[32,26],[23,4],[27,32],[19,10],[20,24],[9,12],[1,12],[16,12],[6,14],[11,21],[6,4],[11,22],[31,27],[21,20],[17,30],[31,32],[3,17],[27,22],[21,28],[25,5],[29,27],[31,18],[31,30],[29,27],[12,21],[29,10],[3,18],[21,31],[8,15],[16,22],[16,21],[32,31],[31,8],[5,13],[11,19],[23,4],[23,10],[5,26],[25,7],[8,27],[32,9],[30,28],[13,23],[32,28],[16,21],[31,32],[25,16],[32,28],[23,26],[11,22],[20,21],[28,12],[15,12],[14,13],[5,18],[15,14],[7,27],[11,0],[15,18],[32,17],[21,7],[27,26],[27,12],[27,32],[31,32],[19,30],[26,28],[32,31],[31,9],[30,26],[30,28],[27,24],[31,32],[14,20],[22,5],[5,26],[24,28],[29,30],[15,31],[11,30],[32,26],[31,13],[14,27],[32,18],[19,0],[28,24],[26,32],[17,15],[28,8],[26,10],[26,24],[21,10],[1,31],[14,29],[32,29],[9,16],[31,28],[25,31],[22,29],[32,22],[4,0],[26,5],[30,32],[8,24],[30,17],[32,30],[21,16],[17,24],[30,26],[18,32],[27,26],[16,31],[25,7],[30,18],[0,25],[32,31],[4,26],[31,27],[20,32],[9,24],[1,31],[22,30],[27,30],[23,32],[29,31],[31,30],[30,19],[6,5],[31,30],[22,1],[29,27],[24,31],[23,22],[15,20],[21,15],[8,14],[1,10],[32,23],[27,14],[15,30],[30,32],[28,30],[9,16],[20,14],[20,21],[32,25],[28,20],[29,16],[7,1],[7,28],[10,12],[20,27],[24,26],[6,26],[23,17],[20,6],[14,7],[30,15],[32,27],[30,27],[27,30],[24,1],[31,30],[30,28],[27,22],[22,27],[14,13],[28,17],[31,30],[23,29],[17,24],[29,32],[19,21],[29,21],[25,28],[16,12],[30,26],[10,19],[30,0],[20,12],[3,9],[7,32],[12,21],[24,8]]; + checkIfPrerequisite(n, prerequisites, queries); + }); +}); diff --git a/lab/exercises/10-mixed/linked-list-data-equality.js b/lab/exercises/10-mixed/linked-list-data-equality.js new file mode 100644 index 00000000..7e61ffeb --- /dev/null +++ b/lab/exercises/10-mixed/linked-list-data-equality.js @@ -0,0 +1,49 @@ +/** + * Given two linked list, determine if they have the same data + + **Input:** + L1: he → ll → o + + L2: hel → l → o + + **Output:** + + True + + class Node { + constructor(value) { + this.value = value; + this.next = null; + this.previous = null; + } + } + + * @param {Node} l1 - The list 1. + * @param {Node} l2 - The list 2. + */ +function hasSameData(l1, l2) { + if (l1 !== l2 && (!l1 || !l2)) return false; + let p1 = l1; + let p2 = l2; + let i1 = 0; + let i2 = 0; + + while (p1 && p2) { + // console.log({v1: p1.value[i1], v2: p2.value[i2], i1, i2}) + if (p1.value[i1] !== p2.value[i2]) return false; + i1++; + i2++; + if (i1 >= p1.value.length) { + p1 = p1.next; + i1 = 0; + } + if (i2 >= p2.value.length) { + p2 = p2.next; + i2 = 0; + } + } + + return true; +} + +module.exports = hasSameData; diff --git a/lab/exercises/10-mixed/linked-list-data-equality.spec.js b/lab/exercises/10-mixed/linked-list-data-equality.spec.js new file mode 100644 index 00000000..ff971732 --- /dev/null +++ b/lab/exercises/10-mixed/linked-list-data-equality.spec.js @@ -0,0 +1,40 @@ +const hasSameData = require('./linked-list-data-equality'); +const { LinkedList } = require('../../../src/index'); + +describe('Linked List: Has Same Data', () => { + it('should work', () => { + const l1 = new LinkedList(['h', 'i']); + const l2 = new LinkedList(['hi']); + expect(hasSameData(l1.first, l2.first)).toEqual(true); + }); + + it('should work', () => { + const l1 = new LinkedList(['he', 'll', 'o']); + const l2 = new LinkedList(['hel', 'l', 'o']); + expect(hasSameData(l1.first, l2.first)).toEqual(true); + }); + + it('should work', () => { + const l1 = new LinkedList(['he', 'll', 'o']); + const l2 = new LinkedList(['ho', 'l', 'a']); + expect(hasSameData(l1.first, l2.first)).toEqual(false); + }); + + it('should work when one is empty', () => { + const l1 = new LinkedList(); + const l2 = new LinkedList(['ho', 'l', 'a']); + expect(hasSameData(l1.first, l2.first)).toEqual(false); + }); + + it('should work when both are empty', () => { + const l1 = new LinkedList(); + const l2 = new LinkedList(); + expect(hasSameData(l1.first, l2.first)).toEqual(true); + }); + + it('should work when one is empty and other null', () => { + const l1 = new LinkedList(['']); + const l2 = new LinkedList(); + expect(hasSameData(l1.first, l2.first)).toEqual(false); + }); +}); diff --git a/lab/exercises/10-mixed/maze.js b/lab/exercises/10-mixed/maze.js new file mode 100644 index 00000000..1218e740 --- /dev/null +++ b/lab/exercises/10-mixed/maze.js @@ -0,0 +1,45 @@ +function hasPath(maze, start, destination) { + const queue = [start]; + const directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]; // right, left, up, down, + + for (const curr of queue) { + let [currRow, currCol] = curr; + if (destination[0] === currRow && destination[1] === currCol) return true; + maze[currRow][currCol] = 2; // mark as visited. + + // console.log({ + // currRow, currCol, maze, queue, + // }); + + for (const [nextRow, nextCol] of directions) { + [currRow, currCol] = curr; // reset to start point + while (currRow >= 0 && currRow < maze.length && currCol >= 0 && currCol < maze[currRow].length && maze[currRow][currCol] !== 1) { + currRow += nextRow; + currCol += nextCol; + } + // step back one position to go before the wall. + currRow -= nextRow; + currCol -= nextCol; + // check if it hasn't been visited + if (maze[currRow][currCol] === 0) queue.push([currRow, currCol]); + // console.log('*', { currRow, currCol, queue }); + } + } + + return false; +} + +module.exports = hasPath; + +/* / +const start = [0, 4]; +const end = [3, 2]; +const maze = [ + [0, 0, 1, 0, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 1, 0], + [1, 1, 0, 1, 1], + [0, 0, 0, 0, 0], +]; +hasPath(maze, start, end); +// */ diff --git a/lab/exercises/10-mixed/maze.spec.js b/lab/exercises/10-mixed/maze.spec.js new file mode 100644 index 00000000..5826dbfd --- /dev/null +++ b/lab/exercises/10-mixed/maze.spec.js @@ -0,0 +1,24 @@ +// npx jest lab/exercises/10-mixed/maze.spec.js --collectCoverage +const fn = require('./maze'); + +describe('The Maze', () => { + const maze = [ + [0, 0, 1, 0, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 1, 0], + [1, 1, 0, 1, 1], + [0, 0, 0, 0, 0], + ]; + + it('should have path', () => { + const start = [0, 4]; + const end = [4, 4]; + expect(fn(maze, start, end)).toEqual(true); + }); + + it('should NOT have path', () => { + const start = [0, 4]; + const end = [3, 2]; + expect(fn(maze, start, end)).toEqual(false); + }); +}); From c7e5c310074b8368424f18618b2e7fec409147b2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 30 Jun 2020 11:27:55 +0000 Subject: [PATCH 090/200] :bookmark: chore(release): 1.9.0 # [1.9.0](https://github.com/amejiarosario/dsa.js/compare/1.8.3...1.9.0) (2020-06-30) ### Features * **heap:** remove by index ([6af937f](https://github.com/amejiarosario/dsa.js/commit/6af937fb380ffcd26558193c1626bdb84b2abe17)) * **linkedList:** takes iterables in the constructor ([1fa875f](https://github.com/amejiarosario/dsa.js/commit/1fa875fd772eb4a45dd9690bea593b513687caca)) --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09ba1001..eefac3b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [1.9.0](https://github.com/amejiarosario/dsa.js/compare/1.8.3...1.9.0) (2020-06-30) + + +### Features + +* **heap:** remove by index ([6af937f](https://github.com/amejiarosario/dsa.js/commit/6af937fb380ffcd26558193c1626bdb84b2abe17)) +* **linkedList:** takes iterables in the constructor ([1fa875f](https://github.com/amejiarosario/dsa.js/commit/1fa875fd772eb4a45dd9690bea593b513687caca)) + ## [1.8.3](https://github.com/amejiarosario/dsa.js/compare/1.8.2...1.8.3) (2020-05-24) diff --git a/package-lock.json b/package-lock.json index 734ae1f2..ad8516f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.3", + "version": "1.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f27525a6..c07facfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.8.3", + "version": "1.9.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 3f99c56832747d00a99f83caba4a512132fe7b6c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 9 Jul 2020 19:59:10 -0400 Subject: [PATCH 091/200] chore(lab): add new exercises and fix comment:wq --- .../10-mixed/trie-wildcard-search.js | 54 +++++++++++++++++++ .../10-mixed/trie-wildcard-search.spec.js | 47 ++++++++++++++++ src/data-structures/graphs/graph.js | 9 +--- 3 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 lab/exercises/10-mixed/trie-wildcard-search.js create mode 100644 lab/exercises/10-mixed/trie-wildcard-search.spec.js diff --git a/lab/exercises/10-mixed/trie-wildcard-search.js b/lab/exercises/10-mixed/trie-wildcard-search.js new file mode 100644 index 00000000..b2d403d1 --- /dev/null +++ b/lab/exercises/10-mixed/trie-wildcard-search.js @@ -0,0 +1,54 @@ +/** + * Your WordDictionary object will be instantiated and called as such: + * var obj = new WordDictionary() + * obj.addWord(word) + * var param_2 = obj.search(word) + */ +class WordDictionary { + children = {}; + isWord = false; + /** + * Initialize your data structure here. + */ + constructor() { + } + + /** + * Adds a word into the data structure. + * @param {string} word + * @return {void} + */ + addWord (word) { + let curr = this; + + for (let char of word) { + if (!curr.children[char]) curr.children[char] = new WordDictionary(); + curr = curr.children[char]; + } + + curr.isWord = true; + } + + /** + * Returns if the word is in the data structure. + * A word could contain the dot character '.' to represent any one letter. + * @param {string} word + * @return {boolean} + */ + search (word, curr = this, index = 0) { + if (index > word.length) return true; // e.g. final '.' + for (let [i, char] of [...word.slice(index)].entries()) { + if (char === '.') { + for (let child of Object.keys(curr.children)) { + if (this.search(word, curr.children[child], i + 1)) return true; + } + } + else if (!curr || !curr.children[char]) return false; + curr = curr.children[char]; + } + + return curr.isWord; + } +} + +module.exports = WordDictionary; diff --git a/lab/exercises/10-mixed/trie-wildcard-search.spec.js b/lab/exercises/10-mixed/trie-wildcard-search.spec.js new file mode 100644 index 00000000..e1aabc90 --- /dev/null +++ b/lab/exercises/10-mixed/trie-wildcard-search.spec.js @@ -0,0 +1,47 @@ +const WordDictionary = require('./trie-wildcard-search'); + +describe('WordDictionary', () => { + let wd; + + beforeEach(() => { + wd = new WordDictionary(); + }); + + describe('should find exact matches', () => { + beforeEach(() => { + wd.addWord('bad'); + wd.addWord('mad'); + }); + + it('should find match', () => { + expect(wd.search('bad')).toEqual(true); + expect(wd.search('mad')).toEqual(true); + }); + + it('should be false for partial match', () => { + expect(wd.search('ba')).toEqual(false); + }); + + it('should be false for NO match', () => { + expect(wd.search('dad')).toEqual(false); + }); + }); + + describe('should find wildcard matches', () => { + beforeEach(() => { + wd.addWord('bad'); + }); + + it('should work with 1 wildcard', () => { + expect(wd.search('.ad')).toEqual(true); + }); + + it('should work with 1 wildcard not match', () => { + expect(wd.search('.ax')).toEqual(false); + }); + + it('should work with 2 wildcard', () => { + expect(wd.search('..d')).toEqual(true); + }); + }); +}); diff --git a/src/data-structures/graphs/graph.js b/src/data-structures/graphs/graph.js index dd1072cd..80fea526 100644 --- a/src/data-structures/graphs/graph.js +++ b/src/data-structures/graphs/graph.js @@ -250,12 +250,7 @@ class Graph { } } -Graph.UNDIRECTED = Symbol('undirected graph'); // one-way edges -Graph.DIRECTED = Symbol('directed graph'); // two-ways edges +Graph.UNDIRECTED = Symbol('directed graph'); // two-ways edges +Graph.DIRECTED = Symbol('undirected graph'); // one-way edges module.exports = Graph; - -/* - * https://repl.it/@amejiarosario/graphpy - * http://www.pythontutor.com/visualize.html#mode=edit - https://goo.gl/Xp7Zpm - */ From bcaf81919cb889c1209c6d1e577b037047714c05 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 28 Jul 2020 14:11:07 -0400 Subject: [PATCH 092/200] feat(book/arrays): add exercises --- book/content/part02/array.asc | 46 +++++++++++++++++++- book/content/part02/linked-list.asc | 4 ++ lab/exercises/01-arrays/rotate-array-left.js | 15 +++++++ lab/exercises/01-arrays/sum-arrays.js | 13 ++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 lab/exercises/01-arrays/rotate-array-left.js create mode 100644 lab/exercises/01-arrays/sum-arrays.js diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 6c95d376..34cadf6a 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -7,7 +7,7 @@ endif::[] === Array (((Array))) (((Data Structures, Linear, Array))) -Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. +Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. ==== Array Basics @@ -274,3 +274,47 @@ To sum up, the time complexity of an array is: | splice ^| O(n) | Insert and remove from anywhere. |=== //end::table + +==== Array Exercises + +1) Implement an efficient algorithm that rotate an array `a` an `k` number of times. + +[source, javascript] +---- +/** + * Rotate an array left by k number of times. + * + * @example + * rotateLeft([1,2,3], 1); // [2,3,1] + * rotateLeft([1,2,3,4,5], 4); // [5,1,2,3,4] + * + * rotateLeft(Array(1e6).fill(1), 1e4); // + * + * @param a - The array + * @param k - The number of times the array is rotated + */ +function rotateLeft(a, k) { + // write you code and test with examples +} +---- + + +2) Implement an algorithm that takes two arrays of numbers and return a new array with the sum. + +[source, javascript] +---- +/** + * Return the sum of two arrays as a new array. + * + * @example + * sum([1,2,3], [1,1,1]); // [2,3,4] + * sum([1], [9,9,9]); // [1,0,0,0] + * + * @param {number[]} a - Array of numbers. + * @param {number[]} b - Array of numbers. + * @returns {number[]} the sum array. + */ +function sum(a, b) { + // write you code and test with examples +} +---- diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 263caef3..6e3f3f98 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -285,3 +285,7 @@ Use a doubly linked list when: * You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we are going use that. + +==== Linked List Exercises + +1) Merge two sorted lists into one (and keep them sorted) diff --git a/lab/exercises/01-arrays/rotate-array-left.js b/lab/exercises/01-arrays/rotate-array-left.js new file mode 100644 index 00000000..88640b89 --- /dev/null +++ b/lab/exercises/01-arrays/rotate-array-left.js @@ -0,0 +1,15 @@ +/** + * Rotate an array left by k number of times. + * + * @example + * rotateLeft([1,2,3], 1); // [2,3,1] + * rotateLeft([1,2,3,4,5], 4); // [5,1,2,3,4] + * + * rotateLeft(Array(1e6).fill(1), 1e4); // + * + * @param a - The array + * @param k - The number of times the array is rotated + */ +function rotateLeft(a, k) { + // write you code and test with examples +} diff --git a/lab/exercises/01-arrays/sum-arrays.js b/lab/exercises/01-arrays/sum-arrays.js new file mode 100644 index 00000000..24d3576a --- /dev/null +++ b/lab/exercises/01-arrays/sum-arrays.js @@ -0,0 +1,13 @@ +/** + * Return the sum of two arrays as a new array. + * + * @example + * sum([1,2,3], [1,1,1]); // [2,3,4] + * sum([1], [9,9,9]); // [1,0,0,0] + * + * @param {number[]} a - Array of numbers. + * @param {number[]} b - Array of numbers. + * @returns {number[]} the sum array. + */ +function sum(a, b) { +} From 482bee0d98008e4d954d8c88c079005a08d02712 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 28 Jul 2020 18:43:33 +0000 Subject: [PATCH 093/200] :bookmark: chore(release): 1.10.0 # [1.10.0](https://github.com/amejiarosario/dsa.js/compare/1.9.0...1.10.0) (2020-07-28) ### Features * **book/arrays:** add exercises ([bcaf819](https://github.com/amejiarosario/dsa.js/commit/bcaf81919cb889c1209c6d1e577b037047714c05)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eefac3b0..52803a7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.10.0](https://github.com/amejiarosario/dsa.js/compare/1.9.0...1.10.0) (2020-07-28) + + +### Features + +* **book/arrays:** add exercises ([bcaf819](https://github.com/amejiarosario/dsa.js/commit/bcaf81919cb889c1209c6d1e577b037047714c05)) + # [1.9.0](https://github.com/amejiarosario/dsa.js/compare/1.8.3...1.9.0) (2020-06-30) diff --git a/package-lock.json b/package-lock.json index ad8516f5..78ca6f10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.9.0", + "version": "1.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c07facfa..24c3fdd2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.9.0", + "version": "1.10.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From cccadf8d31a2ec84fe1a9787a875adeac9568a20 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 6 Aug 2020 14:49:46 -0400 Subject: [PATCH 094/200] chore: remove uxa --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 660f62dc..52316614 100644 --- a/README.md +++ b/README.md @@ -513,4 +513,4 @@ Reach out to me at one of the following places! [![License](https://img.shields.io/:license-mit-blue.svg?style=flat-square)](LICENSE) -![](https://data.uxeranalytics.com/image1.png?uxa=github-dsajs) + From 3901188e613f85bf99e4a7b520a496f7c4e404c8 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 19 Aug 2020 17:48:50 -0400 Subject: [PATCH 095/200] chore(sorting): clean up variables --- src/runtimes/04-merge-sort.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/runtimes/04-merge-sort.js b/src/runtimes/04-merge-sort.js index efb9c7dc..fe7c87a9 100644 --- a/src/runtimes/04-merge-sort.js +++ b/src/runtimes/04-merge-sort.js @@ -11,11 +11,9 @@ const assert = require('assert'); */ function merge(a = [], b = []) { const merged = []; - let ai = 0; - let bi = 0; // merge elements on a and b in asc order. Run-time O(a + b) for (let ai = 0, bi = 0; ai < a.length || bi < b.length;) { - if(ai >= a.length || a[ai] > b[bi]) { + if (ai >= a.length || a[ai] > b[bi]) { merged.push(b[bi++]); } else { merged.push(a[ai++]); From 2fab838cc1654b66453994fc438d57d9e201fd6f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 20 Aug 2020 15:05:01 -0400 Subject: [PATCH 096/200] add config test --- jest.config.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 jest.config.js diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..c2d4001e --- /dev/null +++ b/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + name: 'dsa.js', + testPathIgnorePatterns: ['/node_modules/', '/dist/', 'lab/', 'benchmarks/', 'coverage/'], +}; From 4d75825179b76194932e41f460ff8195b3a37db5 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 20 Aug 2020 15:16:40 -0400 Subject: [PATCH 097/200] chore(jest): fix commands --- jest.config.js | 2 +- package.json | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jest.config.js b/jest.config.js index c2d4001e..59b40aec 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,4 @@ module.exports = { name: 'dsa.js', - testPathIgnorePatterns: ['/node_modules/', '/dist/', 'lab/', 'benchmarks/', 'coverage/'], + testPathIgnorePatterns: ['/node_modules/', '/dist/', '/lab/', '/benchmarks/', '/coverage/'], }; diff --git a/package.json b/package.json index 24c3fdd2..1258285d 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,10 @@ "src/**/*.js" ], "scripts": { - "test": "jest src/", - "watch": "jest src/ --watch --coverage", - "coverage": "jest src/ --coverage && open coverage/lcov-report/index.html", + "test": "jest", + "watch": "jest --watch --coverage", + "coverage": "jest --coverage && open coverage/lcov-report/index.html", + "coverage:win": "jest --coverage && cmd.exe /C start coverage/lcov-report/index.html", "lint": "npx eslint --fix --format codeframe src/", "ci": "npx eslint src/ && jest src/ --coverage", "semantic-release": "semantic-release", From b5a00dded45a1f4eeab3bbbdd68ccbcbf02419d3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 20 Aug 2020 15:17:11 -0400 Subject: [PATCH 098/200] feat(book:array): add solutions for interview questions --- .vscode/settings.json | 14 -------- book/D-interview-questions-solutions.asc | 31 ++++++++++++++++ book/ch02-git-basics-chapter.asc | 35 ------------------- book/content/part02/array.asc | 27 ++++++-------- book/content/preface.asc | 2 +- book/interview-questions/rotate-array-left.js | 34 ++++++++++++++++++ .../rotate-array-left.spec.js | 19 ++++++++++ lab/exercises/01-arrays/rotate-array-left.js | 15 -------- notes.md | 4 +++ 9 files changed, 99 insertions(+), 82 deletions(-) create mode 100644 book/D-interview-questions-solutions.asc delete mode 100644 book/ch02-git-basics-chapter.asc create mode 100644 book/interview-questions/rotate-array-left.js create mode 100644 book/interview-questions/rotate-array-left.spec.js delete mode 100644 lab/exercises/01-arrays/rotate-array-left.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 035ef5b2..1405e3d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,3 @@ { - "workbench.colorCustomizations": { - "activityBar.background": "#fbed80", - "activityBar.foreground": "#15202b", - "activityBar.inactiveForeground": "#15202b99", - "activityBarBadge.background": "#06b9a5", - "activityBarBadge.foreground": "#15202b", - "titleBar.activeBackground": "#f9e64f", - "titleBar.inactiveBackground": "#f9e64f99", - "titleBar.activeForeground": "#15202b", - "titleBar.inactiveForeground": "#15202b99", - "statusBar.background": "#f9e64f", - "statusBarItem.hoverBackground": "#f7df1e", - "statusBar.foreground": "#15202b" - }, "peacock.color": "#f9e64f" } diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc new file mode 100644 index 00000000..d855a2c3 --- /dev/null +++ b/book/D-interview-questions-solutions.asc @@ -0,0 +1,31 @@ +[appendix] +[[d-interview-questions-solutions]] +== Interview Questions Solutions +(((Interview Questions Solutions))) + +=== Solutions for Array Questions +(((Interview Questions Solutions, Arrays))) + +==== Rotate Left +include::content/part02/array.asc[tag=array-q-rotate-left] + +We are asked to rotate an array multiple times (`k`). + +One brute force solution, would be removing the first element and appending it to the end `k` times: + +include::interview-questions/rotate-array-left.js[tag=bruteForce] + +However, what would happen if the array is huge (millions of elements)? +How efficient will be if `k` number is large (thousands)? + +When k is bigger than the array, it will loop back over and over again. We can avoid extra computation by calculating the final place using modulus. + +Here's the final solution: + +include::interview-questions/rotate-array-left.js[tag=description] +include::interview-questions/rotate-array-left.js[tag=solution] + +It runs on `O(n^2)` while the brute force solution was doing `O(n^2 * k)`. + +==== Sum +include::content/part02/array.asc[tag=array-sum] diff --git a/book/ch02-git-basics-chapter.asc b/book/ch02-git-basics-chapter.asc deleted file mode 100644 index cb91537b..00000000 --- a/book/ch02-git-basics-chapter.asc +++ /dev/null @@ -1,35 +0,0 @@ -[[ch02-git-basics-chapter]] -== Git Basics - -If you can read only one chapter to get going with Git, this is it. -This chapter covers every basic command you need to do the vast majority of the things you'll eventually spend your time doing with Git. -By the end of the chapter, you should be able to configure and initialize a repository, begin and stop tracking files, and stage and commit changes. -We'll also show you how to set up Git to ignore certain files and file patterns, how to undo mistakes quickly and easily, how to browse the history of your project and view changes between commits, and how to push and pull from remote repositories. - -[[links]] -=== Links - -.Links to DSA -- Chapter: <> -- Section: <> - -// In <> we used it to specify our name, email address and editor preference before we even got started using Git. - -[source,console] ----- -$ git commit ----- - -Doing so launches your editor of choice. -(This is set by your shell's `EDITOR` environment variable -- usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in - -// <>).(((editor, changing default)))(((git commands, config))) - - - - - -=== Summary - -At this point, you can do all the basic local Git operations -- creating or cloning a repository, making changes, staging and committing those changes, and viewing the history of all the changes the repository has been through. -Next, we'll cover Git's killer feature: its branching model. diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 34cadf6a..09ce419d 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -17,7 +17,8 @@ TIP: Strings are a collection of Unicode characters and most of the array concep .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed size arrays like Java and C++. Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in C++ and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. +Some programming languages have fixed size arrays like Java and C++. +Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in C++ and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: @@ -275,30 +276,21 @@ To sum up, the time complexity of an array is: |=== //end::table -==== Array Exercises +==== Interview Questions +(((Interview Questions, Arrays))) +// tag::array-q-rotate-left[] 1) Implement an efficient algorithm that rotate an array `a` an `k` number of times. [source, javascript] ---- -/** - * Rotate an array left by k number of times. - * - * @example - * rotateLeft([1,2,3], 1); // [2,3,1] - * rotateLeft([1,2,3,4,5], 4); // [5,1,2,3,4] - * - * rotateLeft(Array(1e6).fill(1), 1e4); // - * - * @param a - The array - * @param k - The number of times the array is rotated - */ -function rotateLeft(a, k) { - // write you code and test with examples +include::../../interview-questions/rotate-array-left.js[tag=description] + // write you code here } ---- +// end::array-q-rotate-left[] - +// tag::array-sum[] 2) Implement an algorithm that takes two arrays of numbers and return a new array with the sum. [source, javascript] @@ -318,3 +310,4 @@ function sum(a, b) { // write you code and test with examples } ---- +// end::array-sum[] diff --git a/book/content/preface.asc b/book/content/preface.asc index bb780633..c9823d8b 100644 --- a/book/content/preface.asc +++ b/book/content/preface.asc @@ -82,4 +82,4 @@ Measurement is the first step that leads to control and eventually to improvemen Your feedback is very welcome and valuable. Let us know what your thoughts about this book — what you like or ideas to make it better. -To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/iAmAdrianMejia[@iAmAdrianMejia], or using the hash tags `#dsaJS`, `#javascript` and `#algorithms`. +To send us feedback, e-mail us at hello+dsajs@adrianmejia.com, send a tweet to https://twitter.com/iAmAdrianMejia[@iAmAdrianMejia], or using the hash tag `#dsaJS`. diff --git a/book/interview-questions/rotate-array-left.js b/book/interview-questions/rotate-array-left.js new file mode 100644 index 00000000..236cfc73 --- /dev/null +++ b/book/interview-questions/rotate-array-left.js @@ -0,0 +1,34 @@ +// tag::description[] +/** + * Rotate an array left by k number of times. + * + * @example + * rotateLeft([1,2,3], 1); // [2,3,1] + * rotateLeft([1,2,3,4,5], 4); // [5,1,2,3,4] + * + * rotateLeft(Array(1e6).fill(1), 1e4); // + * + * @param a - The array + * @param k - The number of times the array is rotated + */ +function rotateLeft(a, k) { +// end::description[] +// tag::solution[] + const moves = k % a.length; + for (let i = 0; i < moves; i++) { + a.push(a.shift()); + } + return a; +} +// end::solution[] + +// tag::bruteForce[] +function rotateLeftBruteForce(a, k) { + for (let i = 0; i < k; i++) { + a.push(a.shift()); + } + return a; +} +// end::bruteForce[] + +module.exports = { rotateLeft, rotateLeftBruteForce }; diff --git a/book/interview-questions/rotate-array-left.spec.js b/book/interview-questions/rotate-array-left.spec.js new file mode 100644 index 00000000..762b96a1 --- /dev/null +++ b/book/interview-questions/rotate-array-left.spec.js @@ -0,0 +1,19 @@ +const { rotateLeft, rotateLeftBruteForce } = require('./rotate-array-left'); + +describe('Rotate Left', () => { + describe('when data is small', () => { + it('should work with 1', () => { + expect(rotateLeft([1, 2, 3], 1)).toEqual([2, 3, 1]); + }); + + it('should work with 4', () => { + expect(rotateLeft([1, 2, 3, 4, 5], 4)).toEqual([5, 1, 2, 3, 4]); + }); + }); + + describe('when data is large', () => { + it('', () => { + + }); + }); +}); diff --git a/lab/exercises/01-arrays/rotate-array-left.js b/lab/exercises/01-arrays/rotate-array-left.js deleted file mode 100644 index 88640b89..00000000 --- a/lab/exercises/01-arrays/rotate-array-left.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Rotate an array left by k number of times. - * - * @example - * rotateLeft([1,2,3], 1); // [2,3,1] - * rotateLeft([1,2,3,4,5], 4); // [5,1,2,3,4] - * - * rotateLeft(Array(1e6).fill(1), 1e4); // - * - * @param a - The array - * @param k - The number of times the array is rotated - */ -function rotateLeft(a, k) { - // write you code and test with examples -} diff --git a/notes.md b/notes.md index 21f8845e..c868f237 100644 --- a/notes.md +++ b/notes.md @@ -117,3 +117,7 @@ alert('foo'); console.log('bar'); /* eslint-enable no-alert */ ``` + +# Asciidoctor Manual + +https://asciidoctor.org/docs/user-manual/ From 996f7aa1097234f5f89bb6c96f84e8f622d082de Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 20 Aug 2020 15:20:01 -0400 Subject: [PATCH 099/200] chore(vscode): set colors --- .vscode/settings.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1405e3d2..c4dcc94b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,20 @@ { - "peacock.color": "#f9e64f" + "peacock.color": "#f9e64f", + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#fbed80", + "activityBar.activeBorder": "#06b9a5", + "activityBar.background": "#fbed80", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#06b9a5", + "activityBarBadge.foreground": "#15202b", + "statusBar.background": "#f9e64f", + "statusBar.foreground": "#15202b", + "statusBarItem.hoverBackground": "#f7df1e", + "titleBar.activeBackground": "#f9e64f", + "titleBar.activeForeground": "#15202b", + "titleBar.inactiveBackground": "#f9e64f99", + "titleBar.inactiveForeground": "#15202b99" + }, + "peacock.remoteColor": "#f9e64f" } From ca119f2b2fe5e4392a0b13278b5a6ba9e907952c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 20 Aug 2020 15:23:30 -0400 Subject: [PATCH 100/200] feat(book): add appendix D with interview question solutions --- book/D-interview-questions-solutions.asc | 6 ++++++ book/readme.asc | 2 ++ 2 files changed, 8 insertions(+) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index d855a2c3..7c625434 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -13,7 +13,10 @@ We are asked to rotate an array multiple times (`k`). One brute force solution, would be removing the first element and appending it to the end `k` times: +[source, javascript] +---- include::interview-questions/rotate-array-left.js[tag=bruteForce] +---- However, what would happen if the array is huge (millions of elements)? How efficient will be if `k` number is large (thousands)? @@ -22,8 +25,11 @@ When k is bigger than the array, it will loop back over and over again. We can a Here's the final solution: +[source, javascript] +---- include::interview-questions/rotate-array-left.js[tag=description] include::interview-questions/rotate-array-left.js[tag=solution] +---- It runs on `O(n^2)` while the brute force solution was doing `O(n^2 * k)`. diff --git a/book/readme.asc b/book/readme.asc index 2e291afe..48f92fbe 100644 --- a/book/readme.asc +++ b/book/readme.asc @@ -60,6 +60,8 @@ include::B-self-balancing-binary-search-trees.asc[] include::C-AVL-tree.asc[] +include::D-interview-questions-solutions.asc[] + include::index.asc[] // ifndef::ebook-format[include::index.asc[]] From 57960e2c4f483e779e8344e07406ce7d67d4d9b8 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 21 Aug 2020 14:19:30 -0400 Subject: [PATCH 101/200] fix(book): multiple broken links and bump epub version fixes #60 --- book/A-time-complexity-cheatsheet.asc | 3 +-- book/B-self-balancing-binary-search-trees.asc | 6 ++---- book/C-AVL-tree.asc | 5 ++--- book/config | 2 +- book/content/part02/array-vs-list-vs-queue-vs-stack.asc | 2 +- book/content/part03/map.asc | 2 +- .../part03/time-complexity-graph-data-structures.asc | 2 +- book/content/preface.asc | 2 +- book/index.asc | 3 +-- book/part02-linear-data-structures.asc | 2 +- 10 files changed, 12 insertions(+), 17 deletions(-) diff --git a/book/A-time-complexity-cheatsheet.asc b/book/A-time-complexity-cheatsheet.asc index 64400aaa..b4089138 100644 --- a/book/A-time-complexity-cheatsheet.asc +++ b/book/A-time-complexity-cheatsheet.asc @@ -1,6 +1,5 @@ [appendix] -[[a-time-complexity-cheatsheet]] -== Cheatsheet +== Cheatsheet [[a-time-complexity-cheatsheet]] This section summerize what we are going to cover in the rest of this book. diff --git a/book/B-self-balancing-binary-search-trees.asc b/book/B-self-balancing-binary-search-trees.asc index 249f510c..182bdaa4 100644 --- a/book/B-self-balancing-binary-search-trees.asc +++ b/book/B-self-balancing-binary-search-trees.asc @@ -1,6 +1,5 @@ [appendix] -[[b-self-balancing-binary-search-trees]] -== Self-balancing Binary Search Trees +== Self-balancing Binary Search Trees [[b-self-balancing-binary-search-trees]] Binary Search Trees (BST) are an excellent data structure to find elements very fast _O(log n)_. However, when the BST branches have different branch sizes, then the performance suffers. @@ -28,8 +27,7 @@ As you might notice, we balanced the tree in the example by doing a rotation. To be more specific we rotated node `1` to the left to balance the tree. Let's examine all the possible rotation we can do to balance a tree. -[[tree-rotations]] -=== Tree Rotations +=== Tree Rotations [[tree-rotations]] (((Tree Rotations))) We can do single rotations left and right and also we can do double rotations. Let's go one by one. diff --git a/book/C-AVL-tree.asc b/book/C-AVL-tree.asc index 07bae068..1a8afe83 100644 --- a/book/C-AVL-tree.asc +++ b/book/C-AVL-tree.asc @@ -1,6 +1,5 @@ [appendix] -[[c-avl-tree]] -== AVL Tree +== AVL Tree [[c-avl-tree]] (((AVL Tree))) (((Tree, AVL))) AVL Tree is named after their inventors (**A**delson-**V**elsky and **L**andis). @@ -60,4 +59,4 @@ include::../src/data-structures/trees/avl-tree.js[tag=balance] The first thing we do is to see if one subtree is longer than the other. If so, then we check the children balance to determine if need a single or double rotation and in which direction. -You can review <> in case you want a refresher. +You can review <> in case you want a refresher. diff --git a/book/config b/book/config index f657e9bf..8d7eb9c3 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit f657e9bf4325d4987a30cfc47ad2bbc4bda6b23c +Subproject commit 8d7eb9c34523a92b63164abadf38036ca3088389 diff --git a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc index bc289ed8..b464f17d 100644 --- a/book/content/part02/array-vs-list-vs-queue-vs-stack.asc +++ b/book/content/part02/array-vs-list-vs-queue-vs-stack.asc @@ -31,7 +31,7 @@ In this part of the book, we explored the most used linear data structures such |=== .2+.^s| Data Structure 2+^s| Searching By 3+^s| Inserting at the 3+^s| Deleting from .2+.^s| Space ^|_Index/Key_ ^|_Value_ ^|_beginning_ ^|_middle_ ^|_end_ ^|_beginning_ ^|_middle_ ^|_end_ -| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) +| <> ^|O(1) ^|O(n) ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|O(n) ^|O(1) ^|O(n) | <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|*O(n)* ^|O(1) ^|O(n) ^|*O(n)* ^|O(n) | <> ^|O(n) ^|O(n) ^|O(1) ^|O(n) ^|*O(1)* ^|O(1) ^|O(n) ^|*O(1)* ^|O(n) | <> ^|- ^|- ^|- ^|- ^|O(1) ^|- ^|- ^|O(1) ^|O(n) diff --git a/book/content/part03/map.asc b/book/content/part03/map.asc index 11106d4f..d5448619 100644 --- a/book/content/part03/map.asc +++ b/book/content/part03/map.asc @@ -24,7 +24,7 @@ In short, you set `key`/`value` pair and then you can get the `value` using the The attractive part of Maps is that they are very performant usually *O(1)* or *O(log n)* depending on the implementation. We can implement the maps using two different underlying data structures: * *HashMap*: it’s a map implementation using an *array* and a *hash function*. The job of the hash function is to convert the `key` into an index that maps to the `value`. Optimized HashMap can have an average runtime of *O(1)*. -* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. +* *TreeMap*: it’s a map implementation that uses a self-balanced Binary Search Tree (like <>). The BST nodes store the key, and the value and nodes are sorted by key guaranteeing an *O(log n)* look up. <<< include::hashmap.asc[] diff --git a/book/content/part03/time-complexity-graph-data-structures.asc b/book/content/part03/time-complexity-graph-data-structures.asc index a62d68c4..ed85c1a6 100644 --- a/book/content/part03/time-complexity-graph-data-structures.asc +++ b/book/content/part03/time-complexity-graph-data-structures.asc @@ -14,7 +14,7 @@ In this section, we learned about Graphs applications, properties and how we can .2+.^s| Data Structure 2+^s| Searching By .2+^.^s| Insert .2+^.^s| Delete .2+^.^s| Space Complexity ^|_Index/Key_ ^|_Value_ | <> ^|- ^|O(n) ^|O(n) ^|O(n) ^|O(n) -| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) +| <> ^|- ^|O(log n) ^|O(log n) ^|O(log n) ^|O(n) | Hash Map (naïve) ^|O(n) ^|O(n) ^|O(n) ^|O(n) ^|O(n) | <> (optimized) ^|O(1) ^|O(n) ^|O(1)* ^|O(1) ^|O(n) | <> (Red-Black Tree) ^|O(log n) ^|O(n) ^|O(log n) ^|O(log n) ^|O(n) diff --git a/book/content/preface.asc b/book/content/preface.asc index c9823d8b..afcc20c6 100644 --- a/book/content/preface.asc +++ b/book/content/preface.asc @@ -3,7 +3,7 @@ === What is in this book? -_{doctitle}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or look for ideas to solve a problem optimally. (Check out the <> and <>) +_{doctitle}_ is a book that can be read from cover to cover, where each section builds on top of the previous one. Also, it can be used as a reference manual where developers can refresh specific topics before an interview or look for ideas to solve a problem optimally. (Check out the <> and <>) This publication is designed to be concise, intending to serve software developers looking to get a firm conceptual understanding of data structures in a quick yet in-depth fashion. After reading this book, the reader should have a fundamental knowledge of algorithms, including when and where to apply it, what are the trade-offs of using one data structure over the other. The reader will then be able to make intelligent decisions about algorithms and data structures in their projects. diff --git a/book/index.asc b/book/index.asc index 4312be40..d07d9fba 100644 --- a/book/index.asc +++ b/book/index.asc @@ -1,5 +1,4 @@ [index] -[[index]] -== Index +== Index [[index]] ifndef::backend-pdf[Topical index only available on the PDF version.] diff --git a/book/part02-linear-data-structures.asc b/book/part02-linear-data-structures.asc index ca76e78a..c357fb1d 100644 --- a/book/part02-linear-data-structures.asc +++ b/book/part02-linear-data-structures.asc @@ -6,7 +6,7 @@ Data Structures comes in many flavors. There’s no one to rule them all. You ha Even though in your day-to-day, you might not need to re-implementing them, knowing how they work internally would help you know when to use one over the other or even tweak them to create a new one. We are going to explore the most common data structures' time and space complexity. .In this part we are going to learn about the following linear data structures: -- <> +- <> - <> - <> - <> From 5935b95ea761402b296e5a4fbd6e3643714bcaf9 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 21 Aug 2020 15:58:03 -0400 Subject: [PATCH 102/200] feat(book/array): add max subarray questions and solution --- book/D-interview-questions-solutions.asc | 40 ++++++++------ book/content/part02/array.asc | 33 +++--------- book/interview-questions/max-subarray.data.js | 1 + book/interview-questions/max-subarray.js | 54 +++++++++++++++++++ book/interview-questions/max-subarray.spec.js | 16 ++++++ .../rotate-array-left.spec.js | 19 ------- .../exercises/01-arrays}/rotate-array-left.js | 0 .../01-arrays/rotate-array-left.spec.js | 23 ++++++++ package.json | 4 +- 9 files changed, 129 insertions(+), 61 deletions(-) create mode 100644 book/interview-questions/max-subarray.data.js create mode 100644 book/interview-questions/max-subarray.js create mode 100644 book/interview-questions/max-subarray.spec.js delete mode 100644 book/interview-questions/rotate-array-left.spec.js rename {book/interview-questions => lab/exercises/01-arrays}/rotate-array-left.js (100%) create mode 100644 lab/exercises/01-arrays/rotate-array-left.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 7c625434..422701b6 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -6,32 +6,42 @@ === Solutions for Array Questions (((Interview Questions Solutions, Arrays))) -==== Rotate Left -include::content/part02/array.asc[tag=array-q-rotate-left] +==== Max Subarray [[array-q-max-subarray]] +include::content/part02/array.asc[tag=array-q-max-subarray] -We are asked to rotate an array multiple times (`k`). +The first step, is making sure we understand the problem well. Let's do a basic examples: -One brute force solution, would be removing the first element and appending it to the end `k` times: +---- +A = [-5, 6, 9, -8] +B = [-1, 6, -3, 8] +---- + +What's the subarrays with the maximum sum? For A, it will be `[6, 9]` and for B it will be `[6, -3, 8]`. + +One intution could be to generate all possible subarrays, add them up and then pick the max number. [source, javascript] ---- -include::interview-questions/rotate-array-left.js[tag=bruteForce] +include::interview-questions/max-subarray.js[tag=maxSubArrayBrute1] ---- -However, what would happen if the array is huge (millions of elements)? -How efficient will be if `k` number is large (thousands)? - -When k is bigger than the array, it will loop back over and over again. We can avoid extra computation by calculating the final place using modulus. +This is a simple to understand however not very efficient. The runtime is `O(n^3)`. -Here's the final solution: +If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way we don't have to revisit previous numebers again. [source, javascript] ---- -include::interview-questions/rotate-array-left.js[tag=description] -include::interview-questions/rotate-array-left.js[tag=solution] +include::interview-questions/max-subarray.js[tag=maxSubArrayBrute2] ---- -It runs on `O(n^2)` while the brute force solution was doing `O(n^2 * k)`. +The runtime is much better: `O(n)`. Can we still do better? + +We can use a greedy approach, where do one pass through the array. We only add the numbers if their sum is larger than just taking the current element. + +[source, javascript] +---- +include::interview-questions/max-subarray.js[tag=description] +include::interview-questions/max-subarray.js[tag=solution] +---- -==== Sum -include::content/part02/array.asc[tag=array-sum] +The runtime is `O(n)`! and a space complexity of `O(1)`. diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 09ce419d..c2f83e78 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -4,7 +4,7 @@ ifndef::imagesdir[] endif::[] [[array]] -=== Array +=== Array [[array-chap]] (((Array))) (((Data Structures, Linear, Array))) Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. @@ -279,35 +279,18 @@ To sum up, the time complexity of an array is: ==== Interview Questions (((Interview Questions, Arrays))) -// tag::array-q-rotate-left[] -1) Implement an efficient algorithm that rotate an array `a` an `k` number of times. +===== Max Subarray +// tag::array-q-max-subarray[] +Given an array of integers, find the maximum sum of consecutive elements (subarray). +// end::array-q-max-subarray[] [source, javascript] ---- -include::../../interview-questions/rotate-array-left.js[tag=description] +include::../../interview-questions/max-subarray.js[tag=description] // write you code here } ---- -// end::array-q-rotate-left[] -// tag::array-sum[] -2) Implement an algorithm that takes two arrays of numbers and return a new array with the sum. +_Solution: <>_ -[source, javascript] ----- -/** - * Return the sum of two arrays as a new array. - * - * @example - * sum([1,2,3], [1,1,1]); // [2,3,4] - * sum([1], [9,9,9]); // [1,0,0,0] - * - * @param {number[]} a - Array of numbers. - * @param {number[]} b - Array of numbers. - * @returns {number[]} the sum array. - */ -function sum(a, b) { - // write you code and test with examples -} ----- -// end::array-sum[] +// https://leetcode.com/problemset/algorithms/?topicSlugs=array diff --git a/book/interview-questions/max-subarray.data.js b/book/interview-questions/max-subarray.data.js new file mode 100644 index 00000000..3fce5f6a --- /dev/null +++ b/book/interview-questions/max-subarray.data.js @@ -0,0 +1 @@ +module.exports = [-57,9,-72,-72,-62,45,-97,24,-39,35,-82,-4,-63,1,-93,42,44,1,-75,-25,-87,-16,9,-59,20,5,-95,-41,4,-30,47,46,78,52,74,93,-3,53,17,34,-34,34,-69,-21,-87,-86,-79,56,-9,-55,-69,3,5,16,21,-75,-79,2,-39,25,72,84,-52,27,36,98,20,-90,52,-85,44,94,25,51,-27,37,41,-6,-30,-68,15,-23,11,-79,93,-68,-78,90,11,-41,-8,-17,-56,17,86,56,15,7,66,-56,-2,-13,-62,-77,-62,-12,37,55,81,-93,86,-27,-39,-3,-30,-46,6,-8,-79,-83,50,-10,-24,70,-93,-38,27,-2,45,-7,42,-57,79,56,-57,93,-56,79,48,-98,62,11,-48,-77,84,21,-47,-10,-87,-49,-17,40,40,35,10,23,97,-63,-79,19,6,39,62,-38,-27,81,-68,-7,60,79,-28,-1,-33,23,22,-48,-79,51,18,-66,-98,-98,50,41,13,-63,-59,10,-49,-38,-70,56,77,68,95,-73,26,-73,20,-14,83,91,61,-50,-9,-40,1,11,-88,-80,21,89,97,-29,8,10,-15,48,97,35,86,-96,-9,64,48,-37,90,-26,-10,-13,36,-27,-45,-3,-1,45,34,77,-66,22,73,54,11,70,-97,-81,-43,-13,44,-69,-78,30,-66,-11,-29,58,52,-61,-68,-81,25,44,-32,57,-81,66,2,52,43,35,-26,16,-33,61,-37,-54,80,-3,32,24,27,30,-69,38,-81,2,-4,47,17,5,42,-58,-51,-90,98,-33,76,-22,95,-4,89,-31,-87,-44,-69,-48,1,87,48,-90,-12,-24,39,18,-86,35,96,-14,-41,13,90,-98,32,-83,-89,7,-17,63,84,-21,-40,51,24,-51,83,31,0,-38,-5,-74,-29,59,1,87,-22,-9,-1,-49,76,57,41,44,35,-27,60,23,56,-80,-14,41,-2,22,-31,99,47,-48,7,-75,13,-97,-50,61,61,27,48,-84,94,-76,-56,70,57,84,-9,-7,-66,-49,-84,89,-29,-22,7,45,-99,75,21,24,-95,-71,48,17,-92,74,-22,45,1,-97,61,-5,-74,81,-57,83,42,33,-47,75,61,-55,41,-68,22,-51,53,-1,-99,-25,-76,-95,3,48,-1,-13,23,53,-68,-76,33,92,-4,35,50,38,18,-8,-52,47,-33,-91,91,85,-60,14,-89,93,89,-89,-55,89,92,47,38,-9,-66,-39,-79,-58,-39,53,-65,56,-11,61,-29,83,-46,19,31,-3,27,-1,-18,67,-87,-8,37,79,-20,58,68,-28,-18,-17,39,-8,43,59,33,81,13,44,37,-98,6,85,84,59,4,-8,-44,-69,91,15,74,80,83,-12,59,-37,-54,5,34,27,87,-50,-81,8,-90,52,-11,-1,-4,-97,0,78,87,-39,37,-32,30,70,-1,21,-38,-50,-22,-55,15,-85,8,60,19,-81,-35,-17,-31,-40,90,-45,-88,-44,53,-15,-41,-70,-37,-77,-33,77,-9,96,24,66,-6,85,92,72,-70,7,86,14,-32,-18,33,9,64,78,68,32,-90,57,87,62,-58,-77,68,-19,-54,-65,-42,13,-68,58,-44,25,43,-52,-26,73,55,-63,-13,-77,18,96,31,-40,51,-1,91,60,-44,55,22,-26,78,-10,32,-99,2,66,13,33,25,68,-65,-32,-84,-14,-82,70,22,5,69,-59,-22,-23,0,-70,53,-32,89,85,-77,-11,-40,77,55,68,77,-43,34,-33,66,-41,-88,-98,27,-72,-13,21,74,85,-74,21,-74,-19,97,2,10,50,46,-1,13,69,87,72,23,20,40,1,76,-49,67,43,10,79,21,-86,83,84,34,34,69,37,-45,72,-82,-70,-26,27,56,97,-97,-31,66,67,-82,-11,-13,57,66,-37,85,11,82,-5,-33,3,-15,-50,-13,95,60,-66,9,-84,-94,26,-78,-44,-70,77,-47,-90,-53,95,76,-36,-38,-60,98,-72,-21,83,15,-38,-45,81,41,16,-69,-94,11,91,-84,-79,83,-79,23,-95,-24,30,58,6,39,-95,1,-8,-54,62,31,-56,67,86,-96,-18,-75,-42,-36,66,73,-29,48,-39,-61,63,-42,98,60,81,-97,-64,11,61,18,-73,42,-80,18,87,58,-51,-69,2,-88,-66,84,-63,-32,-75,79,-82,-28,27,-21,11,-33,13,9,-73,-6,-11,-61,81,-73,57,-92,45,53,25,33,11,50,40,90,62,51,74,75,-81,75,54,-86,-53,-42,-8,34,1,-95,-79,27,-24,-14,42,-66,12,-24,-58,-66,-71,43,66,17,-29,-16,7,-90,-65,-42,84,-70,-90,15,-57,-67,49,11,67,-50,-7,64,53,68,-50,-5,78,38,71,96,71,76,40,15,-7,87,98,76,96,-90,-66,57,-61,-57,-51,-41,-47,97,69,-80,-53,-61,83,76,83,-90,-29,62,47,-81,58,18,95,-2,-67,-12,-38,-92,-35,-65,-83,-25,91,-44,-5,-83,-9,47,-86,-40,43,-63,-1,3,-87,-18,12,-39,-79,-41,-21,79,53,-26,-46,63,39,16,70,80,50,87,-45,19,-80,26,35,10,-27,26,46,92,62,-55,-5,52,4,-93,-87,1,-58,-9,-20,95,42,34,58,-19,-73,5,-39,53,-31,-8,-28,-12,95,84,97,-55,10,44,-62,-51,65,32,-99,-54,16,89,47,57,-42,-96,52,99,14,-13,-43,40,69,-6,-6,-62,85,42,26,80,26,0,-74,-87,-79,-60,-38,63,71,-61,85,-13,-71,9,-78,-14,13,50,-38,-73,-85,18,44,83,-88,-85,-79,73,56,23,31,-40,-99,33,-51,97,72,-13,60,20,26,46,84,31,-45,-94,93,67,55,-45,71,69,49,15,52,37,29,50,-13,-38,-50,-82,-2,-73,27,47,-75,-24,-66,84,96,36,7,80,-56,62,62,-63,6,17,-32,-46,-13,93,45,-84,30,-26,42,-82,13,92,-88,-89,-81,16,34,-57,91,45,-95,87,-42,11,44,2,-50,6,15,33,-76,83,86,-13,76,32,-21,-16,82,-78,-22,-28,90,-34,-40,-91,81,93,-71,73,15,-90,37,73,-3,-41,-48,47,64,66,-43,64,49,-57,-72,3,51,7,63,11,28,-82,82,18,-17,-58,3,-58,-87,8,-85,27,17,28,-23,-85,86,28,38,28,-5,94,-31,-79,-86,-3,0,65,80,-60,-24,8,-43,-65,-97,40,-23,-18,81,-11,90,72,92,-16,0,-30,-25,-36,97,-87,68,-31,83,-63,-33,97,10,66,39,-10,-93,91,74,-37,-74,53,79,-21,-64,37,67,-74,9,60,9,86,-70,84,-73,-96,73,94,-50,57,-69,16,31,18,-18,-53,-92,-35,-62,59,5,-60,12,-16,19,47,-78,-14,49,7,-77,-64,-7,-71,96,19,-67,69,-10,-18,3,-2,97,-89,-84,-44,-43,99,-2,-6,58,-97,11,-29,-14,-70,94,-16,-8,44,91,15,79,-39,20,75,57,52,21,-53,-89,-98,44,84,-88,36,-82,-31,36,15,39,-29,17,-50,41,79,-21,13,-36,71,-66,-68,-37,89,-8,82,41,-74,12,-38,-50,-1,-37,70,-39,-48,7,-22,20,-57,69,-41,13,-14,-14,-68,-58,64,21,5,12,54,13,51,43,-94,11,-16,-92,99,22,-43,-2,62,-72,58,-86,11,-87,33,53,81,68,-57,-56,-46,-49,-14,95,71,67,-16,2,-19,-87,-78,-37,0,-18,-30,-1,-95,4,96,66,31,32,79,-81,44,-11,48,3,-66,90,46,-12,-81,-91,-40,66,76,20,-54,-43,9,-33,19,-91,49,88,7,30,-8,-19,-4,99,-87,-48,-82,33,40,65,-64,73,33,59,-62,28,67,-26,-29,43,71,16,99,-20,83,18,-11,9,-16,72,-61,52,-47,34,29,-58,85,23,75,2,-34,87,-48,75,46,-33,3,-9,40,73,-66,-12,-10,-89,68,-50,5,-66,58,88,82,96,18,-64,7,-53,-23,-31,69,-71,47,-88,-83,98,86,39,-35,-34,-70,82,-60,-36,-30,6,-26,-85,55,55,-75,-10,44,84,-37,-38,-80,69,-15,-27,-85,-69,-21,61,-57,-5,59,-71,-66,-98,-5,-59,60,11,4,-93,93,54,98,48,9,99,-85,-70,83,-23,-32,79,-77,52,-47,-63,60,8,97,-97,-97,33,-92,-87,11,-21,-47,-29,66,33,-45,59,-36,-47,-16,50,-48,-2,79,-64,51,-75,-85,73,76,-56,-90,13,51,83,-8,30,17,-23,20,-72,55,49,-24,-1,-17,7,-42,23,59,42,-27,87,-83,-47,99,68,-46,91,18,-93,-88,28,20,40,-12,-88,-30,-95,-12,66,-90,-79,16,-38,19,75,68,76,-2,27,-5,71,-9,12,-99,-32,-43,-46,-41,74,-40,-53,-21,79,86,67,68,-66,48,-67,99,57,-47,15,-81,71,-33,86,25,65,-10,96,36,58,-15,13,-74,41,66,-39,-7,-97,7,71,59,-6,15,27,4,-36,59,3,-79,89,95,-83,37,-38,79,-38,-96,-53,-41,39,-95,43,-71,-93,-38,71,-33,54,74,50,2,10,-79,-82,-86,24,-19,49,-95,1,38,99,-6,-24,-62,-26,14,-58,20,49,57,1,-7,63,-16,31,34,50,-15,-15,-23,86,94,-2,-96,-92,98,-39,34,-97,62,-28,78,-67,24,93,6,-61,-65,-97,87,68,-20,-43,31,63,87,-57,-10,-51,27,67,-87,-1,-35,-84,-17,-60,-23,-83,-57,-84,-34,-79,-52,89,-86,31,-95,-75,10,69,70,90,-97,1,53,67,43,-56,-84,-52,87,-72,46,-71,-79,-71,-32,-26,-77,10,-34,-12,8,-10,-46,-2,-79,-41,0,8,-95,-30,-2,83,47,-72,50,-9,-29,43,15,-65,70,-39,-37,67,-34,31,-59,-12,-82,6,75,25,96,-70,-99,93,-35,0,1,-54,69,75,-71,16,-96,56,83,-49,-1,-2,-14,-31,35,48,-86,-98,-21,-46,-34,-3,37,-58,98,10,-52,98,3,-11,-2,81,11,-33,56,16,60,36,-28,43,87,47,-81,-50,93,53,97,-93,31,-46,-40,97,27,73,-84,25,-17,-60,1,63,5,98,44,-84,-57,-23,8,79,90,57,22,54,4,17,-96,-3,-29,-99,3,78,-69,40,52,57,13,67,-40,73,83,60,36,-12,35,-43,-20,54,10,88,33,0,45,-67,-46,-51,49,-43,23,96,-65,-74,52,-35,42,4,99,-67,-28,-41,-94,-45,-81,18,43,53,74,99,-15,-39,87,-82,61,9,-73,91,58,76,-74,-19,49,-63,-17,1,1,-97,-94,-23,-65,-46,35,-83,8,53,34,-72,-16,-15,-95,68,45,91,62,-17,1,89,-48,-64,42,-46,-7,-9,-10,52,69,67,54,74,-55,65,-72,79,58,12,10,-31,17,70,53,21,38,-24,-11,-23,35,89,-34,86,-98,-92,-60,-6,-24,6,-53,-55,-26,77,-81,18,20,-77,-26,-22,11,60,47,-72,30,-23,25,-55,52,-85,22,-12,80,87,-49,59,72,-32,-47,-52,73,-24,-8,-76,-69,-13,18,50,9,92,-95,96,52,51,-98,-40,-71,26,4,57,17,-74,-78,-25,90,-50,-66,39,17,-37,86,-33,39,-45,-9,69,41,-91,-4,-73,77,0,-77,7,-48,-76,66,-43,50,-30,90,-56,-27,-87,-5,-37,-38,28,-98,55,91,64,-78,7,-81,12,-47,36,-2,48,62,-25,-75,84,81,-47,-91,24,-14,35,94,-23,78,-56,-34,-49,-17,27,78,-16,-18,46,-75,-20,-70,-80,92,-18,55,-10,-93,17,41,-68,1,0,-39,-14,-76,47,-79,94,-76,76,-62,-11,-73,20,92,81,80,-49,28,-95,30,34,-99,22,-83,55,88,99,-28,7,-69,50,-93]; diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js new file mode 100644 index 00000000..3684740a --- /dev/null +++ b/book/interview-questions/max-subarray.js @@ -0,0 +1,54 @@ +// tag::description[] +/** + * Find the maximun sum of contiguous elements in an array. + * @examples + * maxSubArray([1, -3, 10, -5]); // => 10 + * maxSubArray([-3,4,-1,2,1,-5]); // => 6 + * @param {number[]} a - Array + */ +function maxSubArray(a) { +// end::description[] +// tag::solution[] + let max = -Infinity; + let local = 0; + + a.forEach((n) => { + local = Math.max(n, local + n); + max = Math.max(max, local); + }); + + return max; +} +// end::solution[] + +// tag::maxSubArrayBrute1[] +function maxSubArrayBrute1(nums) { + let max = -Infinity; + + for (let i = 0; i < nums.length; i++) { // O(n^3) + for (let j = i + 1; j <= nums.length; j++) { // O(n^2) + const sum = nums.slice(i, j).reduce((a, n) => n + a, 0); // O(n) + max = Math.max(max, sum); // O(1) + } + } + + return max; +} +// end::maxSubArrayBrute1[] + +// tag::maxSubArrayBrute2[] +function maxSubArrayBrute2(nums) { + let max = -Infinity; + + for (let i = 0; i < nums.length; i++) { // O(n) * O(n) + let local = 0; + for (let j = i; j < nums.length; j++) { // O(n) + local += nums[j]; + max = Math.max(max, local); + } + } + return max; +} +// end::maxSubArrayBrute2[] + +module.exports = { maxSubArrayBrute1, maxSubArrayBrute2, maxSubArray }; diff --git a/book/interview-questions/max-subarray.spec.js b/book/interview-questions/max-subarray.spec.js new file mode 100644 index 00000000..e8a43048 --- /dev/null +++ b/book/interview-questions/max-subarray.spec.js @@ -0,0 +1,16 @@ +const { maxSubArray, maxSubArrayBrute1, maxSubArrayBrute2 } = require('./max-subarray'); +const largeArray = require('./max-subarray.data'); + +describe('Max Subarray Sum', () => { + [maxSubArray, maxSubArrayBrute1, maxSubArrayBrute2].forEach((fn) => { + describe(`with ${fn.name}`, () => { + it('should work with small arrays', () => { + expect(fn([-2, 1, -3, 4, -1, 2, 1, -5, 4])).toEqual(6); + }); + + it('should work with large arrays', () => { + expect(fn(largeArray)).toEqual(4853); + }); + }); + }); +}); diff --git a/book/interview-questions/rotate-array-left.spec.js b/book/interview-questions/rotate-array-left.spec.js deleted file mode 100644 index 762b96a1..00000000 --- a/book/interview-questions/rotate-array-left.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -const { rotateLeft, rotateLeftBruteForce } = require('./rotate-array-left'); - -describe('Rotate Left', () => { - describe('when data is small', () => { - it('should work with 1', () => { - expect(rotateLeft([1, 2, 3], 1)).toEqual([2, 3, 1]); - }); - - it('should work with 4', () => { - expect(rotateLeft([1, 2, 3, 4, 5], 4)).toEqual([5, 1, 2, 3, 4]); - }); - }); - - describe('when data is large', () => { - it('', () => { - - }); - }); -}); diff --git a/book/interview-questions/rotate-array-left.js b/lab/exercises/01-arrays/rotate-array-left.js similarity index 100% rename from book/interview-questions/rotate-array-left.js rename to lab/exercises/01-arrays/rotate-array-left.js diff --git a/lab/exercises/01-arrays/rotate-array-left.spec.js b/lab/exercises/01-arrays/rotate-array-left.spec.js new file mode 100644 index 00000000..990e1454 --- /dev/null +++ b/lab/exercises/01-arrays/rotate-array-left.spec.js @@ -0,0 +1,23 @@ +const { rotateLeft, rotateLeftBruteForce } = require('./rotate-array-left'); + +const largeArray = Array(1e6).fill(1).map((t) => t * Math.random()); + +[rotateLeft, rotateLeftBruteForce].forEach((fn) => { + xdescribe(`Rotate Left ${fn.name}`, () => { + describe('when data is small', () => { + it('should work with 1', () => { + expect(fn([1, 2, 3], 1)).toEqual([2, 3, 1]); + }); + + it('should work with 4', () => { + expect(fn([1, 2, 3, 4, 5], 4)).toEqual([5, 1, 2, 3, 4]); + }); + }); + + xdescribe('when data is large', () => { + it('should work at scale', () => { + expect(fn(largeArray, 75863)).toEqual(largeArray); + }); + }); + }); +}); diff --git a/package.json b/package.json index 1258285d..26f202ee 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "src/**/*.js" ], "scripts": { - "test": "jest", - "watch": "jest --watch --coverage", + "test": "jest --verbose", + "watch": "jest --watch --verbose --coverage", "coverage": "jest --coverage && open coverage/lcov-report/index.html", "coverage:win": "jest --coverage && cmd.exe /C start coverage/lcov-report/index.html", "lint": "npx eslint --fix --format codeframe src/", From 6ab8bc4449323b059888edf84d66c76c9e812f4e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 21 Aug 2020 16:52:22 -0400 Subject: [PATCH 103/200] feat(book/array): add stock questions and solution --- book/D-interview-questions-solutions.asc | 63 ++++++++++++++++--- book/content/part02/array.asc | 18 +++++- book/interview-questions/buy-sell-stock.js | 36 +++++++++++ .../buy-sell-stock.spec.js | 19 ++++++ 4 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 book/interview-questions/buy-sell-stock.js create mode 100644 book/interview-questions/buy-sell-stock.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 422701b6..7c0c2ad5 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -6,28 +6,30 @@ === Solutions for Array Questions (((Interview Questions Solutions, Arrays))) -==== Max Subarray [[array-q-max-subarray]] +:leveloffset: -1 + +[#array-q-max-subarray] include::content/part02/array.asc[tag=array-q-max-subarray] -The first step, is making sure we understand the problem well. Let's do a basic examples: +The first step is making sure we understand the problem well. Let's do basic examples: ---- A = [-5, 6, 9, -8] B = [-1, 6, -3, 8] ---- -What's the subarrays with the maximum sum? For A, it will be `[6, 9]` and for B it will be `[6, -3, 8]`. +What's the subarray with the maximum sum? For A, it will be `[6, 9]` and for B, it will be `[6, -3, 8]`. -One intution could be to generate all possible subarrays, add them up and then pick the max number. +We could generate all possible subarrays, add them up, and then pick the max number. [source, javascript] ---- include::interview-questions/max-subarray.js[tag=maxSubArrayBrute1] ---- -This is a simple to understand however not very efficient. The runtime is `O(n^3)`. +This code is simple to understand; however, not very efficient. The runtime is `O(n^3)`. -If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way we don't have to revisit previous numebers again. +If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. [source, javascript] ---- @@ -44,4 +46,51 @@ include::interview-questions/max-subarray.js[tag=description] include::interview-questions/max-subarray.js[tag=solution] ---- -The runtime is `O(n)`! and a space complexity of `O(1)`. +The runtime is `O(n)` and a space complexity of `O(1)`. + + + + +[#array-q-buy-sell-stock] +include::content/part02/array.asc[tag=array-q-buy-sell-stock] + +There are multiple examples that we can simulate: bear markets (when prices are going down), bullish markets (when prices are going up), and zig-zag markets (when prices are going up and down). + +[source, javascript] +---- +// zig-zag market +maxProfit([5, 10, 5, 10]); // => 5 +// bullish market +maxProfit([1, 2, 3]); // => 2 +// bearish market +maxProfit([3, 2, 1]); // => 0 +---- + +During the bearish markets, the profit will always be 0. Since if you buy, we are only going to lose. + +We can do a brute force solution doing all combinations: + +[source, javascript] +---- +include::interview-questions/buy-sell-stock.js[tag=maxProfitBrute1] +---- + +The runtime for this solution is `O(n^2)`. + +A better solution is to eliminate the 2nd for loop and only do one pass. + +Algorithm: + +- Do one pass through all the prices + - Keep track of the minimum price seen so far. + - calculate `profit = currentPrice - minPriceSoFar` + - Keep track of the maximun profit seen so far. +- Return maxProfit. + +[source, javascript] +---- +include::interview-questions/buy-sell-stock.js[tag=description] +include::interview-questions/buy-sell-stock.js[tag=solution] +---- + +The runtime is `O(n)` and a space complexity of `O(1)`. diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index c2f83e78..86cea9d5 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -279,8 +279,9 @@ To sum up, the time complexity of an array is: ==== Interview Questions (((Interview Questions, Arrays))) -===== Max Subarray // tag::array-q-max-subarray[] +===== Max Subarray + Given an array of integers, find the maximum sum of consecutive elements (subarray). // end::array-q-max-subarray[] @@ -293,4 +294,19 @@ include::../../interview-questions/max-subarray.js[tag=description] _Solution: <>_ +// tag::array-q-buy-sell-stock[] +===== Best Time to Buy and Sell an Stock + +You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximun profit you can obtain? (Note: you have to buy first and then sell) +// end::array-q-buy-sell-stock[] + +[source, javascript] +---- +include::../../interview-questions/buy-sell-stock.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ + // https://leetcode.com/problemset/algorithms/?topicSlugs=array diff --git a/book/interview-questions/buy-sell-stock.js b/book/interview-questions/buy-sell-stock.js new file mode 100644 index 00000000..47422ff0 --- /dev/null +++ b/book/interview-questions/buy-sell-stock.js @@ -0,0 +1,36 @@ +// tag::description[] +/** + * Find the max profit from buying and selling a stock given their daily prices. + * @examples + * maxProfit([5, 10, 5, 10]); // => 5 + * maxProfit([1, 2, 3]); // => 2 + * maxProfit([3, 2, 1]); // => 0 + * @param {number[]} prices - Array with daily stock prices + */ +function maxProfit(prices) { +// end::description[] +// tag::solution[] + let max = 0; + let local = Infinity; + for (let i = 0; i < prices.length; i++) { + local = Math.min(local, prices[i]); + max = Math.max(max, prices[i] - local); + } + return max; +} +// end::solution[] + +// tag::maxProfitBrute1[] +function maxProfitBrute1(prices) { + let max = 0; + for (let i = 0; i < prices.length; i++) { + for (let j = i + 1; j < prices.length; j++) { + max = Math.max(max, prices[j] - prices[i]); + } + } + return max; +} +// end::maxProfitBrute1[] + + +module.exports = { maxProfitBrute1, maxProfit }; diff --git a/book/interview-questions/buy-sell-stock.spec.js b/book/interview-questions/buy-sell-stock.spec.js new file mode 100644 index 00000000..bce80375 --- /dev/null +++ b/book/interview-questions/buy-sell-stock.spec.js @@ -0,0 +1,19 @@ +const { maxProfitBrute1, maxProfit } = require('./buy-sell-stock'); + +describe('Best Time to Buy and Sell Stocks', () => { + [maxProfitBrute1, maxProfit].forEach((fn) => { + describe(`with ${fn.name}`, () => { + it('should work with bullish markets', () => { + expect(fn([1, 2, 3])).toEqual(2); + }); + + it('should work with bearish markets', () => { + expect(fn([3, 2, 1])).toEqual(0); + }); + + it('should work with zig-zag markets', () => { + expect(fn([5, 10, 5, 10, 5, 10, 5, 10])).toEqual(5); + }); + }); + }); +}); From dbdef2141ac1449c649cc76790d7990374e78808 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 22 Aug 2020 09:01:46 -0400 Subject: [PATCH 104/200] fix(book): workaround for c++ issue in asciidoc See:https://github.com/asciidoctor/asciidoctor/issues/1208 --- book/content/part02/array.asc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 86cea9d5..4b2c2c7e 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -17,8 +17,8 @@ TIP: Strings are a collection of Unicode characters and most of the array concep .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed size arrays like Java and C++. -Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in C++ and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. +Some programming languages have fixed size arrays like Java and {cpp}. +Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: From e5739297bed36921f2db86fbf79ba04b655cca79 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 22 Aug 2020 13:09:57 +0000 Subject: [PATCH 105/200] :bookmark: chore(release): 1.11.0 # [1.11.0](https://github.com/amejiarosario/dsa.js/compare/1.10.0...1.11.0) (2020-08-22) ### Bug Fixes * **book:** multiple broken links and bump epub version ([57960e2](https://github.com/amejiarosario/dsa.js/commit/57960e2c4f483e779e8344e07406ce7d67d4d9b8)), closes [#60](https://github.com/amejiarosario/dsa.js/issues/60) * **book:** workaround for c++ issue in asciidoc ([dbdef21](https://github.com/amejiarosario/dsa.js/commit/dbdef2141ac1449c649cc76790d7990374e78808)) ### Features * **book:** add appendix D with interview question solutions ([ca119f2](https://github.com/amejiarosario/dsa.js/commit/ca119f2b2fe5e4392a0b13278b5a6ba9e907952c)) * **book:array:** add solutions for interview questions ([b5a00dd](https://github.com/amejiarosario/dsa.js/commit/b5a00dded45a1f4eeab3bbbdd68ccbcbf02419d3)) * **book/array:** add max subarray questions and solution ([5935b95](https://github.com/amejiarosario/dsa.js/commit/5935b95ea761402b296e5a4fbd6e3643714bcaf9)) * **book/array:** add stock questions and solution ([6ab8bc4](https://github.com/amejiarosario/dsa.js/commit/6ab8bc4449323b059888edf84d66c76c9e812f4e)) --- CHANGELOG.md | 16 ++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52803a7c..f68e54e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# [1.11.0](https://github.com/amejiarosario/dsa.js/compare/1.10.0...1.11.0) (2020-08-22) + + +### Bug Fixes + +* **book:** multiple broken links and bump epub version ([57960e2](https://github.com/amejiarosario/dsa.js/commit/57960e2c4f483e779e8344e07406ce7d67d4d9b8)), closes [#60](https://github.com/amejiarosario/dsa.js/issues/60) +* **book:** workaround for c++ issue in asciidoc ([dbdef21](https://github.com/amejiarosario/dsa.js/commit/dbdef2141ac1449c649cc76790d7990374e78808)) + + +### Features + +* **book:** add appendix D with interview question solutions ([ca119f2](https://github.com/amejiarosario/dsa.js/commit/ca119f2b2fe5e4392a0b13278b5a6ba9e907952c)) +* **book:array:** add solutions for interview questions ([b5a00dd](https://github.com/amejiarosario/dsa.js/commit/b5a00dded45a1f4eeab3bbbdd68ccbcbf02419d3)) +* **book/array:** add max subarray questions and solution ([5935b95](https://github.com/amejiarosario/dsa.js/commit/5935b95ea761402b296e5a4fbd6e3643714bcaf9)) +* **book/array:** add stock questions and solution ([6ab8bc4](https://github.com/amejiarosario/dsa.js/commit/6ab8bc4449323b059888edf84d66c76c9e812f4e)) + # [1.10.0](https://github.com/amejiarosario/dsa.js/compare/1.9.0...1.10.0) (2020-07-28) diff --git a/package-lock.json b/package-lock.json index 78ca6f10..c148c0af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.10.0", + "version": "1.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 26f202ee..777f62aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.10.0", + "version": "1.11.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From f12551102948753b13ee6ee7ad2857e85153ceab Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 24 Aug 2020 11:23:42 -0400 Subject: [PATCH 106/200] chore(build): dockerfile --- .vscode/settings.json | 14 -------------- book/config | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 035ef5b2..1405e3d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,3 @@ { - "workbench.colorCustomizations": { - "activityBar.background": "#fbed80", - "activityBar.foreground": "#15202b", - "activityBar.inactiveForeground": "#15202b99", - "activityBarBadge.background": "#06b9a5", - "activityBarBadge.foreground": "#15202b", - "titleBar.activeBackground": "#f9e64f", - "titleBar.inactiveBackground": "#f9e64f99", - "titleBar.activeForeground": "#15202b", - "titleBar.inactiveForeground": "#15202b99", - "statusBar.background": "#f9e64f", - "statusBarItem.hoverBackground": "#f7df1e", - "statusBar.foreground": "#15202b" - }, "peacock.color": "#f9e64f" } diff --git a/book/config b/book/config index f657e9bf..4389b4ad 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit f657e9bf4325d4987a30cfc47ad2bbc4bda6b23c +Subproject commit 4389b4adf8c37cba0b40c3d5679da81e0b9838a6 From 738d6f3423a26451766ace84dcfe2e5d12e4dae1 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 24 Aug 2020 14:56:27 -0400 Subject: [PATCH 107/200] chore(build): add Dockerfile --- Dockerfile | 1 - book/config | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index bb7dbd1b..84cdc3eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,6 @@ RUN bundle -v RUN apt-get update && apt-get install -y \ graphviz \ - cmake bison flex libffi-dev libxml2-dev libgdk-pixbuf2.0-dev libcairo2-dev libpango1.0-dev ttf-lyx \ graphicsmagick-imagemagick-compat graphicsmagick-libmagick-dev-compat RUN cd book/config && bundle install diff --git a/book/config b/book/config index 4389b4ad..1216accf 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit 4389b4adf8c37cba0b40c3d5679da81e0b9838a6 +Subproject commit 1216accfbd750b835ba92c196aa20ddd3414c515 From 69f284d913ba5e1f67100e9a8a7764b47c482248 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 24 Aug 2020 15:05:22 -0400 Subject: [PATCH 108/200] chore(build): use jest config --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 777f62aa..641276ff 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,10 @@ "scripts": { "test": "jest --verbose", "watch": "jest --watch --verbose --coverage", + "ci": "npx eslint src/ && jest --coverage", "coverage": "jest --coverage && open coverage/lcov-report/index.html", "coverage:win": "jest --coverage && cmd.exe /C start coverage/lcov-report/index.html", "lint": "npx eslint --fix --format codeframe src/", - "ci": "npx eslint src/ && jest src/ --coverage", "semantic-release": "semantic-release", "release:check": "semantic-release --dry-run" }, From db10bf733de9fb5baabb5264bc06606420cc464f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 24 Aug 2020 15:10:18 -0400 Subject: [PATCH 109/200] chore(build): update ruby version --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f7c264fa..551c07d9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -52,7 +52,7 @@ jobs: # a collection of steps docs: docker: - - image: circleci/ruby:2.5.3-stretch-node + - image: circleci/ruby:2.7.1-buster-node environment: NOKOGIRI_USE_SYSTEM_LIBRARIES: true steps: From d3faa71b774a111ad0853c4b0fe52a17209a0175 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 24 Aug 2020 15:12:44 -0400 Subject: [PATCH 110/200] chore(build): remove deprecated dep --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 551c07d9..b2fcb55b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,7 +84,7 @@ jobs: # a collection of steps - run: name: Bundle Install.pre - needed for mathematical -> 'asciidoctor-mathematical' gem - command: sudo apt-get -qq -y install cmake bison flex libffi-dev libxml2-dev libgdk-pixbuf2.0-dev libcairo2-dev libpango1.0-dev ttf-lyx + command: sudo apt-get -qq -y install cmake bison flex libffi-dev libxml2-dev libgdk-pixbuf2.0-dev libcairo2-dev libpango1.0-dev - run: name: Bundle Install.pre - install GraphicsMagick for 'prawn-gmagick' gem From ca4bf45369ef772f4861e7619d3ea74ddc41cde4 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 26 Aug 2020 16:32:13 -0400 Subject: [PATCH 111/200] feat(book/exercises): interview q&a for linked lists and stacks (#69) * --wip-- [skip ci] * feat(book/linkedlist): add question solution * solution to linkedList problem 2 * LL-2 solution * stack problem and solution * fix italic issue with fira code * stack-2: q & a * gramar fixes --- book/D-interview-questions-solutions.asc | 206 +++++++++++++++++- book/config | 2 +- book/content/part02/array.asc | 34 +-- book/content/part02/linked-list.asc | 93 +++++--- book/content/part02/stack.asc | 54 ++++- .../interview-questions/daily-temperatures.js | 48 ++++ .../daily-temperatures.spec.js | 21 ++ .../linkedlist-same-data.js | 83 +++++++ .../linkedlist-same-data.spec.js | 41 ++++ book/interview-questions/max-subarray.js | 1 + book/interview-questions/merge-lists.js | 37 ++++ book/interview-questions/merge-lists.spec.js | 44 ++++ book/interview-questions/valid-parentheses.js | 27 +++ .../valid-parentheses.spec.js | 23 ++ 14 files changed, 658 insertions(+), 56 deletions(-) create mode 100644 book/interview-questions/daily-temperatures.js create mode 100644 book/interview-questions/daily-temperatures.spec.js create mode 100644 book/interview-questions/linkedlist-same-data.js create mode 100644 book/interview-questions/linkedlist-same-data.spec.js create mode 100644 book/interview-questions/merge-lists.js create mode 100644 book/interview-questions/merge-lists.spec.js create mode 100644 book/interview-questions/valid-parentheses.js create mode 100644 book/interview-questions/valid-parentheses.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 7c0c2ad5..5fe1acf1 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -1,3 +1,4 @@ +<<< [appendix] [[d-interview-questions-solutions]] == Interview Questions Solutions @@ -29,7 +30,7 @@ include::interview-questions/max-subarray.js[tag=maxSubArrayBrute1] This code is simple to understand; however, not very efficient. The runtime is `O(n^3)`. -If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. +Notice we're adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. [source, javascript] ---- @@ -46,7 +47,7 @@ include::interview-questions/max-subarray.js[tag=description] include::interview-questions/max-subarray.js[tag=solution] ---- -The runtime is `O(n)` and a space complexity of `O(1)`. +The runtime is `O(n)` and space complexity of `O(1)`. @@ -93,4 +94,203 @@ include::interview-questions/buy-sell-stock.js[tag=description] include::interview-questions/buy-sell-stock.js[tag=solution] ---- -The runtime is `O(n)` and a space complexity of `O(1)`. +The runtime is `O(n)` and space complexity of `O(1)`. + + + +:leveloffset: +1 + +=== Solutions for Linked List Questions +(((Interview Questions Solutions, Linked Lists))) + +:leveloffset: -1 + + + + +[#linkedlist-q-merge-lists] +include::content/part02/linked-list.asc[tag=linkedlist-q-merge-lists] + +We need to visit each node in both lists and merge them in ascending order. Note: We don't need to copy the values nor create new nodes. + +Another case to take into consideration is that lists might have different lengths. So, if one list runs out, we have to keep taking elements from the remaining list. + +*Algorithm*: + +- Have a pointer for each list +- While there's a pointer that is not null, visite them + - Compare each list node's value and take the smaller one. + - Advance the pointer of the taken node to the next one. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/merge-lists.js[tag=description] +include::interview-questions/merge-lists.js[tag=solution] +---- + +Notice that we used a "dummy" node or "sentinel node" to have some starting point for the final list. + +*Complexity Analysis*: + +- Time: `O(m+n)`. Visiting each node from the list 1 and list 2 has a time complexity `O(m + n)`. `m` and `n` represent each list's length. +- Space: `O(1)`. We reuse the same nodes and only change their `next` pointers. We only create one additional node, "the sentinel node." + + +[#linkedlist-q-linkedlist-same-data] +include::content/part02/linked-list.asc[tag=linkedlist-q-linkedlist-same-data] + +We are given two linked lists that contain string data. We want to know if the concatenated strings from each list are the same. + +The tricky part is that the same data can be distributed differently on the linked lists: + +---- +L1: he -> ll -> o +L2: h -> e -> llo +---- + +One naive approach could be to go through each list's node and concatenate the strings. Then, we can check if they are equal. + +[source, javascript] +---- +include::interview-questions/linkedlist-same-data.js[tag=hasSameDataBrute1] +---- + +Notice that the problem mentions that lists could be huge (millions of nodes). If the first character on each list is different, we are unnecessarily computing millions of nodes, when a straightforward check will do the job. + +A better way to solve this problem is iterating over each character on both lists, and when we found mistmatch, we return `false` immediately. If they are the same, we still have to visit all of them. + +*Algorithm*: + +- Set a pointer to iterate over each node in the lists. +- For each node, have an index (starting at zero) and compare if both lists have the same data. + - When the index reaches the last character on the current node, we move to the next node. + - If we found that a character from one list doesn't match the other, we return `false`. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/linkedlist-same-data.js[tag=description] +include::interview-questions/linkedlist-same-data.js[tag=solution] +---- + +The function `findNextPointerIndex` is a helper to navigate each character on a linked list. +Notice, that we increase the index (`i + 1`) on each iteration. +If the index overflows, it moves to the next node and reset the index to zero. + + + +*Complexity Analysis*: + +- Time: `O(n)`. We go over all the characters on each list +- Space: `O(1)`. Only using pointers and no auxiliary data structures. + + + +:leveloffset: +1 + +=== Solutions for Stack Questions +(((Interview Questions Solutions, Stack))) + +:leveloffset: -1 + +[#stack-q-valid-parentheses] +include::content/part02/stack.asc[tag=stack-q-valid-parentheses] + +.We need to validate that brackets are properly opened and closed, following these rules: +- An opened bracket must be close by the same type. +- Open brackets mush be closed in the correct order. + +This is a parsing problem, and usually, stacks are good candidates for them. + +*Algorithm*: + +- Create a mapping for each opening bracket, to its closing counterpart. +- Iterate through the string + - When we found an opening bracket, insert the corresponding closing bracket into the stack. + - When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. +- Check the stack is empty. If there's a leftover, it means that something didn't close properly. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/valid-parentheses.js[tag=description] +include::interview-questions/valid-parentheses.js[tag=solution] +---- + +*Complexity Analysis*: + +- Time: `O(n)`. We iterate over each character of the string. +- Space: `O(n)`. We use an auxiliary stack. + + + +[#stack-q-daily-temperatures] +include::content/part02/stack.asc[tag=stack-q-daily-temperatures] + +The first solution that might come to mind it's using two for loops. For each element, we have visit each temperature ahead to find a bigger one. + +[source, javascript] +---- +include::interview-questions/daily-temperatures.js[tag=dailyTemperaturesBrute1] +---- + +This solution is an `O(n^2)`. Can we do better? We can! + +Here's an idea: start backward, so we know when there's a warmer temperature beforehand. The last element is always 0 (because there are no more temperatures ahead of it). We can place each element's index that we visit on a stack. If the current weather is bigger than the stack top, we remove it until a bigger one remains or the stack is empty. If the stack has a value, we calculate the number of days ahead. Otherwise, it is 0. + +*Algorithm*: + +- Traverse the daily temperatures backward + - Push each temperature to a stack. + - While the current temperature is larger than the one at the top of the stack, pop it. + - If the stack is empty, then there's no warmer weather ahead, so it's 0. + - If the stack has an element, calculate the index delta. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/daily-temperatures.js[tag=description] +include::interview-questions/daily-temperatures.js[tag=solution] +---- + +The stack contains the indexes rather than the temperatures themselves. + +*Complexity Analysis*: + +- Time: `O(n)`. We visit each element on the array once. +- Space: `O(1)`. The worst-case scenario is ascending order without duplicates. The stack will hold at most 70 items (100 - 30). If we didn't have the range restriction, then space complexity would be `O(n)`. + + + +// [#linkedlist-q-FILENAME] +// include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] + +// RESTATE REQUIREMENTS AND DESCRIPTIONS + +// *Algorithm*: + +// - STEP 1 +// - STEP 2 +// - STEP 2.1 +// - STEP 2.2 + +// *Implementation*: + +// [source, javascript] +// ---- +// include::interview-questions/FILENAME.js[tag=description] +// include::interview-questions/FILENAME.js[tag=solution] +// ---- + +// IMPLEMENTATION NOTES + +// *Complexity Analysis*: + +// - Time: `O(?)`. WHY? +// - Space: `O(?)`. WHY? + diff --git a/book/config b/book/config index 1216accf..b4dd20d3 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit 1216accfbd750b835ba92c196aa20ddd3414c515 +Subproject commit b4dd20d3f92beb4dd48445464e1734819a9cd40a diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 4b2c2c7e..e03863e5 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -7,18 +7,18 @@ endif::[] === Array [[array-chap]] (((Array))) (((Data Structures, Linear, Array))) -Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. +Arrays are one of the most used data structures. You probably have used it a lot, but are you aware of the runtimes of `splice`, `shift`, `indexOf`, and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. ==== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. -TIP: Strings are a collection of Unicode characters and most of the array concepts apply to them. +TIP: Strings are a collection of Unicode characters, and most of the array concepts apply to them. .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed size arrays like Java and {cpp}. -Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. +Some programming languages have fixed-size arrays like Java and {cpp}. +Fixed-size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. Those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: @@ -26,11 +26,11 @@ Arrays look like this: .Array representation: each value is accessed through an index. image::image16.png[image,width=388,height=110] -Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. +Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look at the different operations that we can do with arrays. ==== Insertion -Arrays are built-in into most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: +Arrays are built-in in most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: .Inserting elements into an array [source, javascript] @@ -45,7 +45,7 @@ array2[100] = 2; array2 // [empty × 3, 1, empty × 96, 2] ---- -Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers but the length is 101 and there are 99 empty spaces. +Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers, but the length is 101, and there are 99 empty spaces. [source, javascript] ---- @@ -54,7 +54,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] ---- -The runtime for inserting elements using index is always is constant: _O(1)_. +The runtime for inserting elements using an index is always is constant: _O(1)_. ===== Inserting at the beginning of the array @@ -72,7 +72,7 @@ As you can see, `2` was at index 0, now was pushed to index 1, and everything el .JavaScript built-in `array.unshift` **** -The `unshift()` method adds one or more elements to the beginning of an array and returns the new length of the array. +The `unshift()` method adds one or more elements to the beginning of an array and returns the array's new length. Runtime: O(n). **** @@ -90,11 +90,11 @@ array.splice(1, 0, 111); // ↪️ [] <1> ---- <1> at position `1`, delete `0` elements and insert `111`. -The Big O for this operation would be *O(n)* since in worst case it would move most of the elements to the right. +The Big O for this operation would be *O(n)* since, in the worst case, it would move most of the elements to the right. .JavaScript built-in `array.splice` **** -The `splice()` method changes the contents of an array by removing existing elements or adding new elements. Splice returns an array containing the deleted elements. +The `splice()` method changes an array's contents by removing existing elements or adding new elements. Splice returns an array containing the deleted items. Runtime: O(n). **** @@ -116,7 +116,7 @@ Adding to the tail of the array doesn’t change other indexes. E.g., element 2 .JavaScript built-in `array.push` **** -The `push()` method adds one or more elements to the end of an array and returns the new length of the array. +The `push()` method adds one or more elements to the end of an array and returns the array's new length. Runtime: O(1). **** @@ -124,7 +124,7 @@ Runtime: O(1). [[array-search-by-value]] ==== Searching by value and index -Searching by index is very easy using the `[]` operator: +Searching by the index is very easy using the `[]` operator: .Search by index [source, javascript] @@ -185,7 +185,7 @@ We would have to loop through the whole array (worst case) or until we find it: ==== Deletion -There are three possible scenarios for deletion (similar to insertion): removing at the beginning, middle or end. +There are three possible deletion scenarios (similar to insertion): removing at the beginning, middle, or end. ===== Deleting element from the beginning @@ -224,7 +224,7 @@ array.splice(2, 1); // ↪️[2] <1> ---- <1> delete 1 element at position 2 -Deleting from the middle might cause most of the elements of the array to move up one position to fill in for the eliminated item. Thus, runtime: O(n). +Deleting from the middle might cause most of the array elements to move up one position to fill in for the eliminated item. Thus, runtime: O(n). ===== Deleting element from the end @@ -282,7 +282,7 @@ To sum up, the time complexity of an array is: // tag::array-q-max-subarray[] ===== Max Subarray -Given an array of integers, find the maximum sum of consecutive elements (subarray). +*AR-1*) _Given an array of integers, find the maximum sum of consecutive elements (subarray)._ // end::array-q-max-subarray[] [source, javascript] @@ -297,7 +297,7 @@ _Solution: <>_ // tag::array-q-buy-sell-stock[] ===== Best Time to Buy and Sell an Stock -You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximun profit you can obtain? (Note: you have to buy first and then sell) +*AR-2*) _You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximum profit you can obtain? (Note: you have to buy first and then sell)_ // end::array-q-buy-sell-stock[] [source, javascript] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 6e3f3f98..7790c3e4 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -23,7 +23,7 @@ Each element or node is *connected* to the next one by a reference. When a node .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. image::image19.png[image,width=498,height=97] -Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. +Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is by using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. [[doubly-linked-list]] ==== Doubly Linked List @@ -47,9 +47,9 @@ include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ==== Linked List vs. Array -Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. +Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst-case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. -We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. When it is getting full, it has to create a bigger array (usually 2x) and copy all the elements. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor large chunks of memory have to be booked beforehand like arrays. Linked List is more on a "grow as you go" basis. +We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. It has to create a larger array (usually 2x) and copy all the elements when it is getting full. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor are large chunks of memory booked beforehand like arrays. Linked List is more on a "grow as you go" basis. Another difference is that adding/deleting at the beginning on an array takes O(n); however, the linked list is a constant operation O(1) as we will implement later. @@ -70,7 +70,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] } ---- -In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. +In our constructor, we reference the `first` and `last` node for performance reasons. ==== Searching by value @@ -84,7 +84,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByValue If we find the element, we will return the index otherwise `undefined`. The runtime for locating an item by value is _O(n)_. -For finding elements by value or position we are using the following helper function: +For finding elements by value or position, we are using the following helper function: .Find elements using a callback [source, javascript] @@ -92,8 +92,8 @@ For finding elements by value or position we are using the following helper func include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent=0] ---- <1> We initialize two variables `current` to the first node and `position` to keep track of the index. -<2> While `current` node is not null we keep going. -<3> On each loop we move to the next node and increment the index. +<2> While the `current` node is not null, we keep going. +<3> On each loop, we move to the next node and increment the index. <4> We invoke the callback passing the current position and node. If the callback returns something, then we stop and return that value. <5> Return whatever result we got from the callback. E.g., we can return the index or the node itself or any other calculation. @@ -101,7 +101,7 @@ We are going to use this `find` method again to implement searching by index. ==== Searching by index -Searching by index is very similar, we iterate through the list until we find the element that matches the position. +Searching by an index is very similar, we iterate through the list until we find the element that matches the position. .Linked List's searching by index (position) [source, javascript] @@ -109,22 +109,22 @@ Searching by index is very similar, we iterate through the list until we find th include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex, indent=0] ---- -If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation, https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. +If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar; you want to take a look at the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[full implementation]. ==== Insertion -Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. +In a linked list, you can add elements at the beginning, end, or anywhere in the middle of the list. So, let's implement each case. [[linked-list-inserting-beginning]] ===== Inserting elements at the beginning of the list -We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. +We will use the `Node` class to create a new element and stick it at the beginning of the list, as shown below. .Insert at the beginning by linking the new node with the current first node. image::image23.png[image,width=498,height=217] -To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: +To insert at the beginning, we create a new node with the next reference to the current first node. Then we first make the new node. In code, it would look something like this: .Add item to the beginning of a Linked List [source, javascript] @@ -137,7 +137,7 @@ As you can see, we create a new node and make it the first one. ===== Inserting element at the end of the list -Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. +Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list image::image24.png[image,width=498,height=208] @@ -148,12 +148,12 @@ image::image24.png[image,width=498,height=208] include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, indent=0] ---- -If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. +If there’s no element in the list yet, the first and last node would be the same. If there’s something, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. ===== Inserting element at the middle of the list -For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. +For inserting an element in the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. .There are 4 references to update: . New node's `next`. @@ -168,7 +168,7 @@ Let’s do an example with the following doubly linked list: art <-> dog <-> cat ---- -We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. +We want to insert the `new` node in the 2^nd^ position. For that, we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. image::image25.png[image,width=528,height=358] @@ -181,11 +181,11 @@ Take a look into the implementation of https://github.com/amejiarosario/dsa.js/b include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, indent=0] ---- <1> If the new item goes to position 0, then we reuse the `addFirst` method, and we are done! -<2> However, if we are adding to the last position, then we reuse the `addLast` method, and done! -<3> Adding `newNode` to the middle: First, create the `new` node only if the position exists. Take a look at <> to see `get` implementation. +<2> However, if we add to the last position, we reuse the `addLast` method and done! +<3> Adding `newNode` to the middle: First, create the `new` node only if it exists. Take a look at <> to see `get` implementation. <4> Set newNode `previous` reference. <5> Set newNode `next` link. -<6> No other node in the list is pointing to `newNode`, so we have to make the prior element point to `newNode`. +<6> No other node in the list points to `newNode`, so we have to make the prior element point to `newNode`. <7> Make the next element point to `newNode`. Take notice that we reused `addFirst` and `addLast` methods. For all the other cases, the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting in the middle takes *O(n)* because we have to iterate through the list using the `get` method. @@ -219,7 +219,7 @@ Removing the last element from the list would require to iterate from the head u image::image27.png[image,width=528,height=221] -For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat”, it is out of the list and eventually is deleted from memory by the garbage collector. +For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat.” Since nothing is pointing to “cat” it is out of the list and eventually is deleted from memory by the garbage collector. .Linked List's remove from the end of the list [source, javascript] @@ -228,7 +228,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i ---- -The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. +The code is very similar to `removeFirst`, but instead of first, we update `last` reference, and instead of nullifying `previous`, we nullify its `next` reference. ===== Deleting element from the middle @@ -238,7 +238,7 @@ To remove a node from the middle, we make the surrounding nodes to bypass the on image::image28.png[image,width=528,height=259] -In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art”, totally bypassing “dog”. +In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art,” totally bypassing “dog.” Let’s implement it: @@ -252,7 +252,7 @@ Notice that we are using the `get` method to get the node at the current positio ==== Linked List Complexity vs. Array Complexity -So far, we have seen two liner data structures with different use cases. Here’s a summary: +So far, we have seen two-liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) // tag::table[] @@ -268,9 +268,9 @@ So far, we have seen two liner data structures with different use cases. Here’ (((Linear))) (((Runtime, Linear))) -If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly linked list is *O(1)*. +If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly-linked list is *O(1)*. -Comparing an array with a doubly linked list, both have different use cases: +Comparing an array with a doubly-linked list, both have different use cases: Use arrays when: @@ -282,10 +282,45 @@ Use a doubly linked list when: * You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). -* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. +* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go.” -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly-linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we will use that. -==== Linked List Exercises +==== Interview Questions +(((Interview Questions, Arrays))) -1) Merge two sorted lists into one (and keep them sorted) + + + +// tag::linkedlist-q-merge-lists[] +===== Merge Linked Lists into One + +*LL-1*) _Merge two sorted lists into one (and keep them sorted)_ +// end::linkedlist-q-merge-lists[] + +[source, javascript] +---- +include::../../interview-questions/merge-lists.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ + + + + +// tag::linkedlist-q-linkedlist-same-data[] +===== Check if two strings lists are the same + +*LL-2*) _Given two linked lists with strings, check if are the same_ +// end::linkedlist-q-linkedlist-same-data[] + +[source, javascript] +---- +include::../../interview-questions/linkedlist-same-data.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 81ced6f2..02643814 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -11,7 +11,7 @@ endif::[] (((LIFO))) The stack is a data structure that restricts the way you add and remove data. It only allows you to insert and retrieve in a *Last-In-First-Out* (LIFO) fashion. -An analogy is to think that the stack is a rod and the data are discs. You can only take out the last one you put in. +An analogy is to think that the stack is a rod, and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out image::image29.png[image,width=240,height=238] @@ -20,7 +20,7 @@ image::image29.png[image,width=240,height=238] As you can see in the image above, If you insert the disks in the order `5`, `4`, `3`, `2`, `1`, then you can remove them in `1`, `2`, `3`, `4`, `5`. -The stack inserts items to the end of the collection and also removes from the end. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. +The stack inserts items to the end of the collection and also removes it from the rear. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. .Stack's constructor [source, javascript] @@ -30,7 +30,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=constructor] } ---- -As you can see in the stack constructor, we are using a linked list as the underlying data structure. +As you can see in the stack constructor, we use a linked list as the underlying data structure. Let's now develop the insert and remove operations in a stack. @@ -48,7 +48,7 @@ We are returning `this`, in case we want to chain multiple add commands. ==== Deletion -Deleting is straightforward as well. +Deleting is straightforward, as well. .Stack's remove [source, javascript] @@ -56,7 +56,7 @@ Deleting is straightforward as well. include::{codedir}/data-structures/stacks/stack.js[tag=remove, indent=0] ---- -This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the full implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[here]. +This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[full implementation]. ==== Implementation Usage @@ -68,7 +68,7 @@ We can use our stack implementation as follows: include::{codedir}/data-structures/stacks/stack.js[tag=snippet, indent=0] ---- -As you can see if we add new items they will be the first to go out to honor LIFO. +As you can see, if we add new items, they will be the first to go out to honor LIFO. ==== Stack Complexity @@ -85,3 +85,45 @@ Implementing the stack with an array and linked list would lead to the same time // end::table[] It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks are especially useful for implementing <>. + + +==== Interview Questions +(((Interview Questions, Arrays))) + + + + + +// tag::stack-q-valid-parentheses[] +===== Validate Parentheses / Braces / Brackets + +*ST-1*) _Given an string with 3 types of brakets: `()`, `{}`, and `[]`. Validate they are properly closed and opened._ +// end::stack-q-valid-parentheses[] + +[source, javascript] +---- +include::../../interview-questions/valid-parentheses.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ + + + + + +// tag::stack-q-daily-temperatures[] +===== Daily Temperaturs + +*ST-2*) _Given an array of integers from 30 to 100 (daily temperatures), return another array that for each day in the input, tells you how many days you would have to wait until a warmer temperature. If no warmer temperature is possible then return `0` for that element._ +// end::stack-q-daily-temperatures[] + +[source, javascript] +---- +include::../../interview-questions/daily-temperatures.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ diff --git a/book/interview-questions/daily-temperatures.js b/book/interview-questions/daily-temperatures.js new file mode 100644 index 00000000..5a4b4613 --- /dev/null +++ b/book/interview-questions/daily-temperatures.js @@ -0,0 +1,48 @@ +// tag::description[] +/** + * Given an array with daily temperatures (30 °C to 100 °C), + * return an array with the days count until a warmer temperature + * for each elem from the input. + * + * @examples + * dailyTemperatures([30, 28, 50, 40, 30]); // [2, 1, 0, 0, 0] + * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] + * + * @param {number[]} t - Daily temperatures + */ +function dailyTemperatures(t) { + // end::description[] + // tag::solution[] + const last = (arr) => arr[arr.length - 1]; + const stack = []; + const ans = []; + + for (let i = t.length - 1; i >= 0; i--) { + while (stack.length && t[i] >= t[last(stack)]) stack.pop(); + ans[i] = stack.length ? last(stack) - i : 0; + stack.push(i); + } + + return ans; +} +// end::solution[] + +// tag::dailyTemperaturesBrute1[] +function dailyTemperaturesBrute1(t) { + const ans = []; + + for (let i = 0; i < t.length; i++) { + ans[i] = 0; + for (let j = i + 1; j < t.length; j++) { + if (t[j] > t[i]) { + ans[i] = j - i; + break; + } + } + } + + return ans; +} +// end::dailyTemperaturesBrute1[] + +module.exports = { dailyTemperatures, dailyTemperaturesBrute1 }; diff --git a/book/interview-questions/daily-temperatures.spec.js b/book/interview-questions/daily-temperatures.spec.js new file mode 100644 index 00000000..3ff950d7 --- /dev/null +++ b/book/interview-questions/daily-temperatures.spec.js @@ -0,0 +1,21 @@ +const { dailyTemperatures } = require('./daily-temperatures'); + +describe('Stack: Daily Temperatures', () => { + it('should work', () => { + expect(dailyTemperatures([30, 28, 50, 40, 30])).toEqual([2, 1, 0, 0, 0]); + }); + + it('should work', () => { + expect(dailyTemperatures([73, 74, 75, 71, 69, 72, 76, 73])).toEqual([1, 1, 4, 2, 1, 1, 0, 0]); + }); + + it('should work', () => { + expect(dailyTemperatures([89, 62, 70, 58, 47, 47, 46, 76, 100, 70])).toEqual([8, 1, 5, 4, 3, 2, 1, 1, 0, 0]); + }); + + it('should work with large data', () => { + const input = [64, 40, 49, 73, 72, 35, 68, 83, 35, 73, 84, 88, 96, 43, 74, 63, 41, 95, 48, 46, 89, 72, 34, 85, 72, 59, 87, 49, 30, 32, 47, 34, 74, 58, 31, 75, 73, 88, 64, 92, 83, 64, 100, 99, 81, 41, 48, 83, 96, 92, 82, 32, 35, 68, 68, 92, 73, 92, 52, 33, 44, 38, 47, 88, 71, 50, 57, 95, 33, 65, 94, 44, 47, 79, 41, 74, 50, 67, 97, 31, 68, 50, 37, 70, 77, 55, 48, 30, 77, 100, 31, 100, 69, 60, 47, 95, 68, 47, 33, 64]; + const output = [3, 1, 1, 4, 3, 1, 1, 3, 1, 1, 1, 1, 30, 1, 3, 2, 1, 25, 2, 1, 19, 2, 1, 3, 2, 1, 11, 5, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 1, 3, 2, 1, 0, 46, 3, 1, 1, 1, 30, 18, 5, 1, 1, 2, 1, 12, 1, 10, 5, 1, 2, 1, 1, 4, 3, 1, 1, 11, 1, 1, 8, 1, 1, 5, 1, 3, 1, 1, 11, 1, 3, 2, 1, 1, 5, 3, 2, 1, 1, 0, 1, 0, 3, 2, 1, 0, 0, 2, 1, 0]; + expect(dailyTemperatures(input)).toEqual(output); + }); +}); diff --git a/book/interview-questions/linkedlist-same-data.js b/book/interview-questions/linkedlist-same-data.js new file mode 100644 index 00000000..fd303d36 --- /dev/null +++ b/book/interview-questions/linkedlist-same-data.js @@ -0,0 +1,83 @@ +// const ListNode = require('../../src/data-structures/linked-lists/node'); + +// tag::description[] +/** + * Check if two lists has the same string data. + * Note: each lists can be huge, they have up to 10 million nodes. + * + * @examples + * hasSameData(['he', 'll', 'o'], ['hel', 'lo']); // true + * hasSameData(['hel', 'lo'], ['hi']); // false + * + * @param {ListNode} l1 - The root node of list 1 + * @param {ListNode} l2 - The root node of list 2 + */ +function hasSameData(l1, l2) { + // end::description[] + // tag::solution[] + let p1 = l1; + let p2 = l2; + let i1 = -1; + let i2 = -1; + + const findNextPointerIndex = (p, i) => { + let node = p; + let index = i; + while (node && index >= node.value.length) { + node = node.next; + index = 0; + } + return [node, index]; + }; + + while (p1 && p2) { + [p1, i1] = findNextPointerIndex(p1, i1 + 1); + [p2, i2] = findNextPointerIndex(p2, i2 + 1); + if ((p1 && p2 && p1.value[i1] !== p2.value[i2]) + || ((!p1 || !p2) && p1 !== p2)) return false; + } + return true; +} +// end::solution[] + +// tag::hasSameDataBrute1[] +function hasSameDataBrute1(l1, l2) { + function toString(node) { + const str = []; + for (let curr = node; curr; curr = curr.next) { + str.push(curr.value); + } + return str.join(''); + } + + // console.log({s1: toString(l1), s2: toString(l2) }); + return toString(l1) === toString(l2); +} +// end::hasSameDataBrute1[] + +function hasSameData1(l1, l2) { + let p1 = l1; + let p2 = l2; + + let i1 = 0; + let i2 = 0; + + while (p1 || p2) { + if (!p1 || !p2 || p1.value[i1] !== p2.value[i2]) return false; + + if (i1 < p1.value.length - 1) i1++; + else { + p1 = p1.next; + i1 = 0; + } + + if (i2 < p2.value.length - 1) i2++; + else { + p2 = p2.next; + i2 = 0; + } + } + return true; +} + +module.exports = { hasSameData, hasSameDataBrute1, hasSameData1 }; diff --git a/book/interview-questions/linkedlist-same-data.spec.js b/book/interview-questions/linkedlist-same-data.spec.js new file mode 100644 index 00000000..c0d26830 --- /dev/null +++ b/book/interview-questions/linkedlist-same-data.spec.js @@ -0,0 +1,41 @@ +const { hasSameData } = require('./linkedlist-same-data'); +const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); + +describe('Linked List: has same data', () => { + it('should work with same data and shape', () => { + const l1 = new LinkedList(['hi']).first; + const l2 = new LinkedList(['hi']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + it('should work with different data', () => { + const l1 = new LinkedList(['ab']).first; + const l2 = new LinkedList(['a']).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); + + it('should work with same data and but different shape', () => { + const l1 = new LinkedList(['h', 'e', 'l', 'l', 'o']).first; + const l2 = new LinkedList(['hello']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + it('should work with different data', () => { + const l1 = new LinkedList(['he', 'll', 'o']).first; + const l2 = new LinkedList(['ho', 'la']).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); + + it('should handle empty', () => { + const l1 = new LinkedList(['hi']).first; + const l2 = new LinkedList(['', 'h', '', 'i']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + xit('should work with large data', () => { + const size = 1e6; // 1e7 takes 4sec. + const l1 = new LinkedList(Array(size).fill('x')).first; + const l2 = new LinkedList(Array(size).fill('z')).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); +}); diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js index 3684740a..0245702f 100644 --- a/book/interview-questions/max-subarray.js +++ b/book/interview-questions/max-subarray.js @@ -4,6 +4,7 @@ * @examples * maxSubArray([1, -3, 10, -5]); // => 10 * maxSubArray([-3,4,-1,2,1,-5]); // => 6 + * * @param {number[]} a - Array */ function maxSubArray(a) { diff --git a/book/interview-questions/merge-lists.js b/book/interview-questions/merge-lists.js new file mode 100644 index 00000000..ad26c326 --- /dev/null +++ b/book/interview-questions/merge-lists.js @@ -0,0 +1,37 @@ +const ListNode = require('../../src/data-structures/linked-lists/node'); +// tag::description[] +/** + * Given two sorted linked lists merge them while keeping the asc order. + * @examples + * mergeTwoLists([2,4,6], [1,3]); // => [1,2,3,4,6] + * mergeTwoLists([2,4,6], []); // => [2,4,6] + * mergeTwoLists([], [1,3]); // => [1,3] + * + * @param {ListNode} l1 - The root node of list 1 + * @param {ListNode} l2 - The root node of list 2 + */ +function mergeTwoLists(l1, l2) { + // end::description[] + // tag::solution[] + const sentinel = new ListNode(); + let p0 = sentinel; + let p1 = l1; + let p2 = l2; + + while (p1 || p2) { + if (!p1 || (p2 && p1.value > p2.value)) { + p0.next = p2; + p2 = p2.next; + } else { + p0.next = p1; + p1 = p1.next; + } + p0 = p0.next; + } + + return sentinel.next; +} +// end::solution[] + + +module.exports = { mergeTwoLists }; diff --git a/book/interview-questions/merge-lists.spec.js b/book/interview-questions/merge-lists.spec.js new file mode 100644 index 00000000..4b06e8ee --- /dev/null +++ b/book/interview-questions/merge-lists.spec.js @@ -0,0 +1,44 @@ +const { mergeTwoLists } = require('./merge-lists'); +const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); + +describe('Linked List: Merge Lists', () => { + function asString(root) { + const values = []; + for (let curr = root; curr; curr = curr.next) { + values.push(curr.value); + } + return values.join(' -> '); + } + + it('should merge in asc order', () => { + const l1 = new LinkedList([2, 3, 4]).first; + const l2 = new LinkedList([1, 2]).first; + const actual = mergeTwoLists(l1, l2); + const expected = '1 -> 2 -> 2 -> 3 -> 4'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty list 1', () => { + const l1 = new LinkedList().first; + const l2 = new LinkedList([1, 2]).first; + const actual = mergeTwoLists(l1, l2); + const expected = '1 -> 2'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty list 1', () => { + const l1 = new LinkedList([2, 3, 4]).first; + const l2 = new LinkedList().first; + const actual = mergeTwoLists(l1, l2); + const expected = '2 -> 3 -> 4'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty lists', () => { + const l1 = new LinkedList().first; + const l2 = new LinkedList().first; + const actual = mergeTwoLists(l1, l2); + const expected = ''; + expect(asString(actual)).toEqual(expected); + }); +}); diff --git a/book/interview-questions/valid-parentheses.js b/book/interview-questions/valid-parentheses.js new file mode 100644 index 00000000..a822a214 --- /dev/null +++ b/book/interview-questions/valid-parentheses.js @@ -0,0 +1,27 @@ +// tag::description[] +/** + * Validate if the parentheses are opened and closed in the right order. + * + * @example + * isParenthesesValid('(){}[]'); // true + * isParenthesesValid('([{}])'); // true + * isParenthesesValid('([{)}]'); // false + * + * @param {string} string - The string + */ +function isParenthesesValid(string) { + // end::description[] + // tag::solution[] + const map = new Map([['(', ')'], ['{', '}'], ['[', ']']]); + const stack = []; + + for (const c of string) { + if (map.has(c)) stack.push(map.get(c)); + else if (c !== stack.pop()) return false; + } + + return stack.length === 0; +} +// end::solution[] + +module.exports = { isParenthesesValid }; diff --git a/book/interview-questions/valid-parentheses.spec.js b/book/interview-questions/valid-parentheses.spec.js new file mode 100644 index 00000000..fcb392f3 --- /dev/null +++ b/book/interview-questions/valid-parentheses.spec.js @@ -0,0 +1,23 @@ +const { isParenthesesValid } = require('./valid-parentheses'); + +describe('Stack: Valid Parentheses', () => { + it('should be valid', () => { + expect(isParenthesesValid('()')).toEqual(true); + }); + + it('should be valid with different kinds', () => { + expect(isParenthesesValid('()[]{}')).toEqual(true); + }); + + it('should be valid with different nested kinds', () => { + expect(isParenthesesValid('([{}])')).toEqual(true); + }); + + it('should not be valid if incomplete', () => { + expect(isParenthesesValid('()(')).toEqual(false); + }); + + it('should not be valid if invalid character is present', () => { + expect(isParenthesesValid('()-')).toEqual(false); + }); +}); From 06bd3f6a8542b111e4c9e3b5d41050094b153112 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 26 Aug 2020 16:38:28 -0400 Subject: [PATCH 112/200] Revert "(book/exercises): interview q&a for linked lists and stacks (#69)" (#70) This reverts commit ca4bf45369ef772f4861e7619d3ea74ddc41cde4. --- book/D-interview-questions-solutions.asc | 206 +----------------- book/config | 2 +- book/content/part02/array.asc | 34 +-- book/content/part02/linked-list.asc | 93 +++----- book/content/part02/stack.asc | 54 +---- .../interview-questions/daily-temperatures.js | 48 ---- .../daily-temperatures.spec.js | 21 -- .../linkedlist-same-data.js | 83 ------- .../linkedlist-same-data.spec.js | 41 ---- book/interview-questions/max-subarray.js | 1 - book/interview-questions/merge-lists.js | 37 ---- book/interview-questions/merge-lists.spec.js | 44 ---- book/interview-questions/valid-parentheses.js | 27 --- .../valid-parentheses.spec.js | 23 -- 14 files changed, 56 insertions(+), 658 deletions(-) delete mode 100644 book/interview-questions/daily-temperatures.js delete mode 100644 book/interview-questions/daily-temperatures.spec.js delete mode 100644 book/interview-questions/linkedlist-same-data.js delete mode 100644 book/interview-questions/linkedlist-same-data.spec.js delete mode 100644 book/interview-questions/merge-lists.js delete mode 100644 book/interview-questions/merge-lists.spec.js delete mode 100644 book/interview-questions/valid-parentheses.js delete mode 100644 book/interview-questions/valid-parentheses.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 5fe1acf1..7c0c2ad5 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -1,4 +1,3 @@ -<<< [appendix] [[d-interview-questions-solutions]] == Interview Questions Solutions @@ -30,7 +29,7 @@ include::interview-questions/max-subarray.js[tag=maxSubArrayBrute1] This code is simple to understand; however, not very efficient. The runtime is `O(n^3)`. -Notice we're adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. +If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. [source, javascript] ---- @@ -47,7 +46,7 @@ include::interview-questions/max-subarray.js[tag=description] include::interview-questions/max-subarray.js[tag=solution] ---- -The runtime is `O(n)` and space complexity of `O(1)`. +The runtime is `O(n)` and a space complexity of `O(1)`. @@ -94,203 +93,4 @@ include::interview-questions/buy-sell-stock.js[tag=description] include::interview-questions/buy-sell-stock.js[tag=solution] ---- -The runtime is `O(n)` and space complexity of `O(1)`. - - - -:leveloffset: +1 - -=== Solutions for Linked List Questions -(((Interview Questions Solutions, Linked Lists))) - -:leveloffset: -1 - - - - -[#linkedlist-q-merge-lists] -include::content/part02/linked-list.asc[tag=linkedlist-q-merge-lists] - -We need to visit each node in both lists and merge them in ascending order. Note: We don't need to copy the values nor create new nodes. - -Another case to take into consideration is that lists might have different lengths. So, if one list runs out, we have to keep taking elements from the remaining list. - -*Algorithm*: - -- Have a pointer for each list -- While there's a pointer that is not null, visite them - - Compare each list node's value and take the smaller one. - - Advance the pointer of the taken node to the next one. - -*Implementation*: - -[source, javascript] ----- -include::interview-questions/merge-lists.js[tag=description] -include::interview-questions/merge-lists.js[tag=solution] ----- - -Notice that we used a "dummy" node or "sentinel node" to have some starting point for the final list. - -*Complexity Analysis*: - -- Time: `O(m+n)`. Visiting each node from the list 1 and list 2 has a time complexity `O(m + n)`. `m` and `n` represent each list's length. -- Space: `O(1)`. We reuse the same nodes and only change their `next` pointers. We only create one additional node, "the sentinel node." - - -[#linkedlist-q-linkedlist-same-data] -include::content/part02/linked-list.asc[tag=linkedlist-q-linkedlist-same-data] - -We are given two linked lists that contain string data. We want to know if the concatenated strings from each list are the same. - -The tricky part is that the same data can be distributed differently on the linked lists: - ----- -L1: he -> ll -> o -L2: h -> e -> llo ----- - -One naive approach could be to go through each list's node and concatenate the strings. Then, we can check if they are equal. - -[source, javascript] ----- -include::interview-questions/linkedlist-same-data.js[tag=hasSameDataBrute1] ----- - -Notice that the problem mentions that lists could be huge (millions of nodes). If the first character on each list is different, we are unnecessarily computing millions of nodes, when a straightforward check will do the job. - -A better way to solve this problem is iterating over each character on both lists, and when we found mistmatch, we return `false` immediately. If they are the same, we still have to visit all of them. - -*Algorithm*: - -- Set a pointer to iterate over each node in the lists. -- For each node, have an index (starting at zero) and compare if both lists have the same data. - - When the index reaches the last character on the current node, we move to the next node. - - If we found that a character from one list doesn't match the other, we return `false`. - -*Implementation*: - -[source, javascript] ----- -include::interview-questions/linkedlist-same-data.js[tag=description] -include::interview-questions/linkedlist-same-data.js[tag=solution] ----- - -The function `findNextPointerIndex` is a helper to navigate each character on a linked list. -Notice, that we increase the index (`i + 1`) on each iteration. -If the index overflows, it moves to the next node and reset the index to zero. - - - -*Complexity Analysis*: - -- Time: `O(n)`. We go over all the characters on each list -- Space: `O(1)`. Only using pointers and no auxiliary data structures. - - - -:leveloffset: +1 - -=== Solutions for Stack Questions -(((Interview Questions Solutions, Stack))) - -:leveloffset: -1 - -[#stack-q-valid-parentheses] -include::content/part02/stack.asc[tag=stack-q-valid-parentheses] - -.We need to validate that brackets are properly opened and closed, following these rules: -- An opened bracket must be close by the same type. -- Open brackets mush be closed in the correct order. - -This is a parsing problem, and usually, stacks are good candidates for them. - -*Algorithm*: - -- Create a mapping for each opening bracket, to its closing counterpart. -- Iterate through the string - - When we found an opening bracket, insert the corresponding closing bracket into the stack. - - When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. -- Check the stack is empty. If there's a leftover, it means that something didn't close properly. - -*Implementation*: - -[source, javascript] ----- -include::interview-questions/valid-parentheses.js[tag=description] -include::interview-questions/valid-parentheses.js[tag=solution] ----- - -*Complexity Analysis*: - -- Time: `O(n)`. We iterate over each character of the string. -- Space: `O(n)`. We use an auxiliary stack. - - - -[#stack-q-daily-temperatures] -include::content/part02/stack.asc[tag=stack-q-daily-temperatures] - -The first solution that might come to mind it's using two for loops. For each element, we have visit each temperature ahead to find a bigger one. - -[source, javascript] ----- -include::interview-questions/daily-temperatures.js[tag=dailyTemperaturesBrute1] ----- - -This solution is an `O(n^2)`. Can we do better? We can! - -Here's an idea: start backward, so we know when there's a warmer temperature beforehand. The last element is always 0 (because there are no more temperatures ahead of it). We can place each element's index that we visit on a stack. If the current weather is bigger than the stack top, we remove it until a bigger one remains or the stack is empty. If the stack has a value, we calculate the number of days ahead. Otherwise, it is 0. - -*Algorithm*: - -- Traverse the daily temperatures backward - - Push each temperature to a stack. - - While the current temperature is larger than the one at the top of the stack, pop it. - - If the stack is empty, then there's no warmer weather ahead, so it's 0. - - If the stack has an element, calculate the index delta. - -*Implementation*: - -[source, javascript] ----- -include::interview-questions/daily-temperatures.js[tag=description] -include::interview-questions/daily-temperatures.js[tag=solution] ----- - -The stack contains the indexes rather than the temperatures themselves. - -*Complexity Analysis*: - -- Time: `O(n)`. We visit each element on the array once. -- Space: `O(1)`. The worst-case scenario is ascending order without duplicates. The stack will hold at most 70 items (100 - 30). If we didn't have the range restriction, then space complexity would be `O(n)`. - - - -// [#linkedlist-q-FILENAME] -// include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] - -// RESTATE REQUIREMENTS AND DESCRIPTIONS - -// *Algorithm*: - -// - STEP 1 -// - STEP 2 -// - STEP 2.1 -// - STEP 2.2 - -// *Implementation*: - -// [source, javascript] -// ---- -// include::interview-questions/FILENAME.js[tag=description] -// include::interview-questions/FILENAME.js[tag=solution] -// ---- - -// IMPLEMENTATION NOTES - -// *Complexity Analysis*: - -// - Time: `O(?)`. WHY? -// - Space: `O(?)`. WHY? - +The runtime is `O(n)` and a space complexity of `O(1)`. diff --git a/book/config b/book/config index b4dd20d3..1216accf 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit b4dd20d3f92beb4dd48445464e1734819a9cd40a +Subproject commit 1216accfbd750b835ba92c196aa20ddd3414c515 diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index e03863e5..4b2c2c7e 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -7,18 +7,18 @@ endif::[] === Array [[array-chap]] (((Array))) (((Data Structures, Linear, Array))) -Arrays are one of the most used data structures. You probably have used it a lot, but are you aware of the runtimes of `splice`, `shift`, `indexOf`, and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. +Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. ==== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. -TIP: Strings are a collection of Unicode characters, and most of the array concepts apply to them. +TIP: Strings are a collection of Unicode characters and most of the array concepts apply to them. .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed-size arrays like Java and {cpp}. -Fixed-size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. Those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. +Some programming languages have fixed size arrays like Java and {cpp}. +Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: @@ -26,11 +26,11 @@ Arrays look like this: .Array representation: each value is accessed through an index. image::image16.png[image,width=388,height=110] -Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look at the different operations that we can do with arrays. +Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. ==== Insertion -Arrays are built-in in most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: +Arrays are built-in into most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: .Inserting elements into an array [source, javascript] @@ -45,7 +45,7 @@ array2[100] = 2; array2 // [empty × 3, 1, empty × 96, 2] ---- -Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers, but the length is 101, and there are 99 empty spaces. +Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers but the length is 101 and there are 99 empty spaces. [source, javascript] ---- @@ -54,7 +54,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] ---- -The runtime for inserting elements using an index is always is constant: _O(1)_. +The runtime for inserting elements using index is always is constant: _O(1)_. ===== Inserting at the beginning of the array @@ -72,7 +72,7 @@ As you can see, `2` was at index 0, now was pushed to index 1, and everything el .JavaScript built-in `array.unshift` **** -The `unshift()` method adds one or more elements to the beginning of an array and returns the array's new length. +The `unshift()` method adds one or more elements to the beginning of an array and returns the new length of the array. Runtime: O(n). **** @@ -90,11 +90,11 @@ array.splice(1, 0, 111); // ↪️ [] <1> ---- <1> at position `1`, delete `0` elements and insert `111`. -The Big O for this operation would be *O(n)* since, in the worst case, it would move most of the elements to the right. +The Big O for this operation would be *O(n)* since in worst case it would move most of the elements to the right. .JavaScript built-in `array.splice` **** -The `splice()` method changes an array's contents by removing existing elements or adding new elements. Splice returns an array containing the deleted items. +The `splice()` method changes the contents of an array by removing existing elements or adding new elements. Splice returns an array containing the deleted elements. Runtime: O(n). **** @@ -116,7 +116,7 @@ Adding to the tail of the array doesn’t change other indexes. E.g., element 2 .JavaScript built-in `array.push` **** -The `push()` method adds one or more elements to the end of an array and returns the array's new length. +The `push()` method adds one or more elements to the end of an array and returns the new length of the array. Runtime: O(1). **** @@ -124,7 +124,7 @@ Runtime: O(1). [[array-search-by-value]] ==== Searching by value and index -Searching by the index is very easy using the `[]` operator: +Searching by index is very easy using the `[]` operator: .Search by index [source, javascript] @@ -185,7 +185,7 @@ We would have to loop through the whole array (worst case) or until we find it: ==== Deletion -There are three possible deletion scenarios (similar to insertion): removing at the beginning, middle, or end. +There are three possible scenarios for deletion (similar to insertion): removing at the beginning, middle or end. ===== Deleting element from the beginning @@ -224,7 +224,7 @@ array.splice(2, 1); // ↪️[2] <1> ---- <1> delete 1 element at position 2 -Deleting from the middle might cause most of the array elements to move up one position to fill in for the eliminated item. Thus, runtime: O(n). +Deleting from the middle might cause most of the elements of the array to move up one position to fill in for the eliminated item. Thus, runtime: O(n). ===== Deleting element from the end @@ -282,7 +282,7 @@ To sum up, the time complexity of an array is: // tag::array-q-max-subarray[] ===== Max Subarray -*AR-1*) _Given an array of integers, find the maximum sum of consecutive elements (subarray)._ +Given an array of integers, find the maximum sum of consecutive elements (subarray). // end::array-q-max-subarray[] [source, javascript] @@ -297,7 +297,7 @@ _Solution: <>_ // tag::array-q-buy-sell-stock[] ===== Best Time to Buy and Sell an Stock -*AR-2*) _You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximum profit you can obtain? (Note: you have to buy first and then sell)_ +You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximun profit you can obtain? (Note: you have to buy first and then sell) // end::array-q-buy-sell-stock[] [source, javascript] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 7790c3e4..6e3f3f98 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -23,7 +23,7 @@ Each element or node is *connected* to the next one by a reference. When a node .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. image::image19.png[image,width=498,height=97] -Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is by using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. +Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. [[doubly-linked-list]] ==== Doubly Linked List @@ -47,9 +47,9 @@ include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ==== Linked List vs. Array -Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst-case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. +Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. -We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. It has to create a larger array (usually 2x) and copy all the elements when it is getting full. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor are large chunks of memory booked beforehand like arrays. Linked List is more on a "grow as you go" basis. +We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. When it is getting full, it has to create a bigger array (usually 2x) and copy all the elements. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor large chunks of memory have to be booked beforehand like arrays. Linked List is more on a "grow as you go" basis. Another difference is that adding/deleting at the beginning on an array takes O(n); however, the linked list is a constant operation O(1) as we will implement later. @@ -70,7 +70,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] } ---- -In our constructor, we reference the `first` and `last` node for performance reasons. +In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. ==== Searching by value @@ -84,7 +84,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByValue If we find the element, we will return the index otherwise `undefined`. The runtime for locating an item by value is _O(n)_. -For finding elements by value or position, we are using the following helper function: +For finding elements by value or position we are using the following helper function: .Find elements using a callback [source, javascript] @@ -92,8 +92,8 @@ For finding elements by value or position, we are using the following helper fun include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent=0] ---- <1> We initialize two variables `current` to the first node and `position` to keep track of the index. -<2> While the `current` node is not null, we keep going. -<3> On each loop, we move to the next node and increment the index. +<2> While `current` node is not null we keep going. +<3> On each loop we move to the next node and increment the index. <4> We invoke the callback passing the current position and node. If the callback returns something, then we stop and return that value. <5> Return whatever result we got from the callback. E.g., we can return the index or the node itself or any other calculation. @@ -101,7 +101,7 @@ We are going to use this `find` method again to implement searching by index. ==== Searching by index -Searching by an index is very similar, we iterate through the list until we find the element that matches the position. +Searching by index is very similar, we iterate through the list until we find the element that matches the position. .Linked List's searching by index (position) [source, javascript] @@ -109,22 +109,22 @@ Searching by an index is very similar, we iterate through the list until we find include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex, indent=0] ---- -If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar; you want to take a look at the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[full implementation]. +If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation, https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. ==== Insertion -In a linked list, you can add elements at the beginning, end, or anywhere in the middle of the list. So, let's implement each case. +Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. [[linked-list-inserting-beginning]] ===== Inserting elements at the beginning of the list -We will use the `Node` class to create a new element and stick it at the beginning of the list, as shown below. +We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. .Insert at the beginning by linking the new node with the current first node. image::image23.png[image,width=498,height=217] -To insert at the beginning, we create a new node with the next reference to the current first node. Then we first make the new node. In code, it would look something like this: +To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: .Add item to the beginning of a Linked List [source, javascript] @@ -137,7 +137,7 @@ As you can see, we create a new node and make it the first one. ===== Inserting element at the end of the list -Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item. Otherwise, you would have to iterate through the whole list. +Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list image::image24.png[image,width=498,height=208] @@ -148,12 +148,12 @@ image::image24.png[image,width=498,height=208] include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, indent=0] ---- -If there’s no element in the list yet, the first and last node would be the same. If there’s something, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. +If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. ===== Inserting element at the middle of the list -For inserting an element in the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. +For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. .There are 4 references to update: . New node's `next`. @@ -168,7 +168,7 @@ Let’s do an example with the following doubly linked list: art <-> dog <-> cat ---- -We want to insert the `new` node in the 2^nd^ position. For that, we first create the "new" node and update the references around it. +We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. image::image25.png[image,width=528,height=358] @@ -181,11 +181,11 @@ Take a look into the implementation of https://github.com/amejiarosario/dsa.js/b include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, indent=0] ---- <1> If the new item goes to position 0, then we reuse the `addFirst` method, and we are done! -<2> However, if we add to the last position, we reuse the `addLast` method and done! -<3> Adding `newNode` to the middle: First, create the `new` node only if it exists. Take a look at <> to see `get` implementation. +<2> However, if we are adding to the last position, then we reuse the `addLast` method, and done! +<3> Adding `newNode` to the middle: First, create the `new` node only if the position exists. Take a look at <> to see `get` implementation. <4> Set newNode `previous` reference. <5> Set newNode `next` link. -<6> No other node in the list points to `newNode`, so we have to make the prior element point to `newNode`. +<6> No other node in the list is pointing to `newNode`, so we have to make the prior element point to `newNode`. <7> Make the next element point to `newNode`. Take notice that we reused `addFirst` and `addLast` methods. For all the other cases, the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting in the middle takes *O(n)* because we have to iterate through the list using the `get` method. @@ -219,7 +219,7 @@ Removing the last element from the list would require to iterate from the head u image::image27.png[image,width=528,height=221] -For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat.” Since nothing is pointing to “cat” it is out of the list and eventually is deleted from memory by the garbage collector. +For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat”, it is out of the list and eventually is deleted from memory by the garbage collector. .Linked List's remove from the end of the list [source, javascript] @@ -228,7 +228,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i ---- -The code is very similar to `removeFirst`, but instead of first, we update `last` reference, and instead of nullifying `previous`, we nullify its `next` reference. +The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. ===== Deleting element from the middle @@ -238,7 +238,7 @@ To remove a node from the middle, we make the surrounding nodes to bypass the on image::image28.png[image,width=528,height=259] -In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art,” totally bypassing “dog.” +In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art”, totally bypassing “dog”. Let’s implement it: @@ -252,7 +252,7 @@ Notice that we are using the `get` method to get the node at the current positio ==== Linked List Complexity vs. Array Complexity -So far, we have seen two-liner data structures with different use cases. Here’s a summary: +So far, we have seen two liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) // tag::table[] @@ -268,9 +268,9 @@ So far, we have seen two-liner data structures with different use cases. Here’ (((Linear))) (((Runtime, Linear))) -If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly-linked list is *O(1)*. +If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly linked list is *O(1)*. -Comparing an array with a doubly-linked list, both have different use cases: +Comparing an array with a doubly linked list, both have different use cases: Use arrays when: @@ -282,45 +282,10 @@ Use a doubly linked list when: * You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). -* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go.” +* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. -For the next two linear data structures <> and <>, we are going to use a doubly-linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we will use that. +For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we are going use that. -==== Interview Questions -(((Interview Questions, Arrays))) +==== Linked List Exercises - - - -// tag::linkedlist-q-merge-lists[] -===== Merge Linked Lists into One - -*LL-1*) _Merge two sorted lists into one (and keep them sorted)_ -// end::linkedlist-q-merge-lists[] - -[source, javascript] ----- -include::../../interview-questions/merge-lists.js[tag=description] - // write you code here -} ----- - -_Solution: <>_ - - - - -// tag::linkedlist-q-linkedlist-same-data[] -===== Check if two strings lists are the same - -*LL-2*) _Given two linked lists with strings, check if are the same_ -// end::linkedlist-q-linkedlist-same-data[] - -[source, javascript] ----- -include::../../interview-questions/linkedlist-same-data.js[tag=description] - // write you code here -} ----- - -_Solution: <>_ +1) Merge two sorted lists into one (and keep them sorted) diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 02643814..81ced6f2 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -11,7 +11,7 @@ endif::[] (((LIFO))) The stack is a data structure that restricts the way you add and remove data. It only allows you to insert and retrieve in a *Last-In-First-Out* (LIFO) fashion. -An analogy is to think that the stack is a rod, and the data are discs. You can only take out the last one you put in. +An analogy is to think that the stack is a rod and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out image::image29.png[image,width=240,height=238] @@ -20,7 +20,7 @@ image::image29.png[image,width=240,height=238] As you can see in the image above, If you insert the disks in the order `5`, `4`, `3`, `2`, `1`, then you can remove them in `1`, `2`, `3`, `4`, `5`. -The stack inserts items to the end of the collection and also removes it from the rear. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. +The stack inserts items to the end of the collection and also removes from the end. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. .Stack's constructor [source, javascript] @@ -30,7 +30,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=constructor] } ---- -As you can see in the stack constructor, we use a linked list as the underlying data structure. +As you can see in the stack constructor, we are using a linked list as the underlying data structure. Let's now develop the insert and remove operations in a stack. @@ -48,7 +48,7 @@ We are returning `this`, in case we want to chain multiple add commands. ==== Deletion -Deleting is straightforward, as well. +Deleting is straightforward as well. .Stack's remove [source, javascript] @@ -56,7 +56,7 @@ Deleting is straightforward, as well. include::{codedir}/data-structures/stacks/stack.js[tag=remove, indent=0] ---- -This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[full implementation]. +This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the full implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[here]. ==== Implementation Usage @@ -68,7 +68,7 @@ We can use our stack implementation as follows: include::{codedir}/data-structures/stacks/stack.js[tag=snippet, indent=0] ---- -As you can see, if we add new items, they will be the first to go out to honor LIFO. +As you can see if we add new items they will be the first to go out to honor LIFO. ==== Stack Complexity @@ -85,45 +85,3 @@ Implementing the stack with an array and linked list would lead to the same time // end::table[] It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks are especially useful for implementing <>. - - -==== Interview Questions -(((Interview Questions, Arrays))) - - - - - -// tag::stack-q-valid-parentheses[] -===== Validate Parentheses / Braces / Brackets - -*ST-1*) _Given an string with 3 types of brakets: `()`, `{}`, and `[]`. Validate they are properly closed and opened._ -// end::stack-q-valid-parentheses[] - -[source, javascript] ----- -include::../../interview-questions/valid-parentheses.js[tag=description] - // write you code here -} ----- - -_Solution: <>_ - - - - - -// tag::stack-q-daily-temperatures[] -===== Daily Temperaturs - -*ST-2*) _Given an array of integers from 30 to 100 (daily temperatures), return another array that for each day in the input, tells you how many days you would have to wait until a warmer temperature. If no warmer temperature is possible then return `0` for that element._ -// end::stack-q-daily-temperatures[] - -[source, javascript] ----- -include::../../interview-questions/daily-temperatures.js[tag=description] - // write you code here -} ----- - -_Solution: <>_ diff --git a/book/interview-questions/daily-temperatures.js b/book/interview-questions/daily-temperatures.js deleted file mode 100644 index 5a4b4613..00000000 --- a/book/interview-questions/daily-temperatures.js +++ /dev/null @@ -1,48 +0,0 @@ -// tag::description[] -/** - * Given an array with daily temperatures (30 °C to 100 °C), - * return an array with the days count until a warmer temperature - * for each elem from the input. - * - * @examples - * dailyTemperatures([30, 28, 50, 40, 30]); // [2, 1, 0, 0, 0] - * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] - * - * @param {number[]} t - Daily temperatures - */ -function dailyTemperatures(t) { - // end::description[] - // tag::solution[] - const last = (arr) => arr[arr.length - 1]; - const stack = []; - const ans = []; - - for (let i = t.length - 1; i >= 0; i--) { - while (stack.length && t[i] >= t[last(stack)]) stack.pop(); - ans[i] = stack.length ? last(stack) - i : 0; - stack.push(i); - } - - return ans; -} -// end::solution[] - -// tag::dailyTemperaturesBrute1[] -function dailyTemperaturesBrute1(t) { - const ans = []; - - for (let i = 0; i < t.length; i++) { - ans[i] = 0; - for (let j = i + 1; j < t.length; j++) { - if (t[j] > t[i]) { - ans[i] = j - i; - break; - } - } - } - - return ans; -} -// end::dailyTemperaturesBrute1[] - -module.exports = { dailyTemperatures, dailyTemperaturesBrute1 }; diff --git a/book/interview-questions/daily-temperatures.spec.js b/book/interview-questions/daily-temperatures.spec.js deleted file mode 100644 index 3ff950d7..00000000 --- a/book/interview-questions/daily-temperatures.spec.js +++ /dev/null @@ -1,21 +0,0 @@ -const { dailyTemperatures } = require('./daily-temperatures'); - -describe('Stack: Daily Temperatures', () => { - it('should work', () => { - expect(dailyTemperatures([30, 28, 50, 40, 30])).toEqual([2, 1, 0, 0, 0]); - }); - - it('should work', () => { - expect(dailyTemperatures([73, 74, 75, 71, 69, 72, 76, 73])).toEqual([1, 1, 4, 2, 1, 1, 0, 0]); - }); - - it('should work', () => { - expect(dailyTemperatures([89, 62, 70, 58, 47, 47, 46, 76, 100, 70])).toEqual([8, 1, 5, 4, 3, 2, 1, 1, 0, 0]); - }); - - it('should work with large data', () => { - const input = [64, 40, 49, 73, 72, 35, 68, 83, 35, 73, 84, 88, 96, 43, 74, 63, 41, 95, 48, 46, 89, 72, 34, 85, 72, 59, 87, 49, 30, 32, 47, 34, 74, 58, 31, 75, 73, 88, 64, 92, 83, 64, 100, 99, 81, 41, 48, 83, 96, 92, 82, 32, 35, 68, 68, 92, 73, 92, 52, 33, 44, 38, 47, 88, 71, 50, 57, 95, 33, 65, 94, 44, 47, 79, 41, 74, 50, 67, 97, 31, 68, 50, 37, 70, 77, 55, 48, 30, 77, 100, 31, 100, 69, 60, 47, 95, 68, 47, 33, 64]; - const output = [3, 1, 1, 4, 3, 1, 1, 3, 1, 1, 1, 1, 30, 1, 3, 2, 1, 25, 2, 1, 19, 2, 1, 3, 2, 1, 11, 5, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 1, 3, 2, 1, 0, 46, 3, 1, 1, 1, 30, 18, 5, 1, 1, 2, 1, 12, 1, 10, 5, 1, 2, 1, 1, 4, 3, 1, 1, 11, 1, 1, 8, 1, 1, 5, 1, 3, 1, 1, 11, 1, 3, 2, 1, 1, 5, 3, 2, 1, 1, 0, 1, 0, 3, 2, 1, 0, 0, 2, 1, 0]; - expect(dailyTemperatures(input)).toEqual(output); - }); -}); diff --git a/book/interview-questions/linkedlist-same-data.js b/book/interview-questions/linkedlist-same-data.js deleted file mode 100644 index fd303d36..00000000 --- a/book/interview-questions/linkedlist-same-data.js +++ /dev/null @@ -1,83 +0,0 @@ -// const ListNode = require('../../src/data-structures/linked-lists/node'); - -// tag::description[] -/** - * Check if two lists has the same string data. - * Note: each lists can be huge, they have up to 10 million nodes. - * - * @examples - * hasSameData(['he', 'll', 'o'], ['hel', 'lo']); // true - * hasSameData(['hel', 'lo'], ['hi']); // false - * - * @param {ListNode} l1 - The root node of list 1 - * @param {ListNode} l2 - The root node of list 2 - */ -function hasSameData(l1, l2) { - // end::description[] - // tag::solution[] - let p1 = l1; - let p2 = l2; - let i1 = -1; - let i2 = -1; - - const findNextPointerIndex = (p, i) => { - let node = p; - let index = i; - while (node && index >= node.value.length) { - node = node.next; - index = 0; - } - return [node, index]; - }; - - while (p1 && p2) { - [p1, i1] = findNextPointerIndex(p1, i1 + 1); - [p2, i2] = findNextPointerIndex(p2, i2 + 1); - if ((p1 && p2 && p1.value[i1] !== p2.value[i2]) - || ((!p1 || !p2) && p1 !== p2)) return false; - } - return true; -} -// end::solution[] - -// tag::hasSameDataBrute1[] -function hasSameDataBrute1(l1, l2) { - function toString(node) { - const str = []; - for (let curr = node; curr; curr = curr.next) { - str.push(curr.value); - } - return str.join(''); - } - - // console.log({s1: toString(l1), s2: toString(l2) }); - return toString(l1) === toString(l2); -} -// end::hasSameDataBrute1[] - -function hasSameData1(l1, l2) { - let p1 = l1; - let p2 = l2; - - let i1 = 0; - let i2 = 0; - - while (p1 || p2) { - if (!p1 || !p2 || p1.value[i1] !== p2.value[i2]) return false; - - if (i1 < p1.value.length - 1) i1++; - else { - p1 = p1.next; - i1 = 0; - } - - if (i2 < p2.value.length - 1) i2++; - else { - p2 = p2.next; - i2 = 0; - } - } - return true; -} - -module.exports = { hasSameData, hasSameDataBrute1, hasSameData1 }; diff --git a/book/interview-questions/linkedlist-same-data.spec.js b/book/interview-questions/linkedlist-same-data.spec.js deleted file mode 100644 index c0d26830..00000000 --- a/book/interview-questions/linkedlist-same-data.spec.js +++ /dev/null @@ -1,41 +0,0 @@ -const { hasSameData } = require('./linkedlist-same-data'); -const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); - -describe('Linked List: has same data', () => { - it('should work with same data and shape', () => { - const l1 = new LinkedList(['hi']).first; - const l2 = new LinkedList(['hi']).first; - expect(hasSameData(l1, l2)).toEqual(true); - }); - - it('should work with different data', () => { - const l1 = new LinkedList(['ab']).first; - const l2 = new LinkedList(['a']).first; - expect(hasSameData(l1, l2)).toEqual(false); - }); - - it('should work with same data and but different shape', () => { - const l1 = new LinkedList(['h', 'e', 'l', 'l', 'o']).first; - const l2 = new LinkedList(['hello']).first; - expect(hasSameData(l1, l2)).toEqual(true); - }); - - it('should work with different data', () => { - const l1 = new LinkedList(['he', 'll', 'o']).first; - const l2 = new LinkedList(['ho', 'la']).first; - expect(hasSameData(l1, l2)).toEqual(false); - }); - - it('should handle empty', () => { - const l1 = new LinkedList(['hi']).first; - const l2 = new LinkedList(['', 'h', '', 'i']).first; - expect(hasSameData(l1, l2)).toEqual(true); - }); - - xit('should work with large data', () => { - const size = 1e6; // 1e7 takes 4sec. - const l1 = new LinkedList(Array(size).fill('x')).first; - const l2 = new LinkedList(Array(size).fill('z')).first; - expect(hasSameData(l1, l2)).toEqual(false); - }); -}); diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js index 0245702f..3684740a 100644 --- a/book/interview-questions/max-subarray.js +++ b/book/interview-questions/max-subarray.js @@ -4,7 +4,6 @@ * @examples * maxSubArray([1, -3, 10, -5]); // => 10 * maxSubArray([-3,4,-1,2,1,-5]); // => 6 - * * @param {number[]} a - Array */ function maxSubArray(a) { diff --git a/book/interview-questions/merge-lists.js b/book/interview-questions/merge-lists.js deleted file mode 100644 index ad26c326..00000000 --- a/book/interview-questions/merge-lists.js +++ /dev/null @@ -1,37 +0,0 @@ -const ListNode = require('../../src/data-structures/linked-lists/node'); -// tag::description[] -/** - * Given two sorted linked lists merge them while keeping the asc order. - * @examples - * mergeTwoLists([2,4,6], [1,3]); // => [1,2,3,4,6] - * mergeTwoLists([2,4,6], []); // => [2,4,6] - * mergeTwoLists([], [1,3]); // => [1,3] - * - * @param {ListNode} l1 - The root node of list 1 - * @param {ListNode} l2 - The root node of list 2 - */ -function mergeTwoLists(l1, l2) { - // end::description[] - // tag::solution[] - const sentinel = new ListNode(); - let p0 = sentinel; - let p1 = l1; - let p2 = l2; - - while (p1 || p2) { - if (!p1 || (p2 && p1.value > p2.value)) { - p0.next = p2; - p2 = p2.next; - } else { - p0.next = p1; - p1 = p1.next; - } - p0 = p0.next; - } - - return sentinel.next; -} -// end::solution[] - - -module.exports = { mergeTwoLists }; diff --git a/book/interview-questions/merge-lists.spec.js b/book/interview-questions/merge-lists.spec.js deleted file mode 100644 index 4b06e8ee..00000000 --- a/book/interview-questions/merge-lists.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -const { mergeTwoLists } = require('./merge-lists'); -const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); - -describe('Linked List: Merge Lists', () => { - function asString(root) { - const values = []; - for (let curr = root; curr; curr = curr.next) { - values.push(curr.value); - } - return values.join(' -> '); - } - - it('should merge in asc order', () => { - const l1 = new LinkedList([2, 3, 4]).first; - const l2 = new LinkedList([1, 2]).first; - const actual = mergeTwoLists(l1, l2); - const expected = '1 -> 2 -> 2 -> 3 -> 4'; - expect(asString(actual)).toEqual(expected); - }); - - it('should handle empty list 1', () => { - const l1 = new LinkedList().first; - const l2 = new LinkedList([1, 2]).first; - const actual = mergeTwoLists(l1, l2); - const expected = '1 -> 2'; - expect(asString(actual)).toEqual(expected); - }); - - it('should handle empty list 1', () => { - const l1 = new LinkedList([2, 3, 4]).first; - const l2 = new LinkedList().first; - const actual = mergeTwoLists(l1, l2); - const expected = '2 -> 3 -> 4'; - expect(asString(actual)).toEqual(expected); - }); - - it('should handle empty lists', () => { - const l1 = new LinkedList().first; - const l2 = new LinkedList().first; - const actual = mergeTwoLists(l1, l2); - const expected = ''; - expect(asString(actual)).toEqual(expected); - }); -}); diff --git a/book/interview-questions/valid-parentheses.js b/book/interview-questions/valid-parentheses.js deleted file mode 100644 index a822a214..00000000 --- a/book/interview-questions/valid-parentheses.js +++ /dev/null @@ -1,27 +0,0 @@ -// tag::description[] -/** - * Validate if the parentheses are opened and closed in the right order. - * - * @example - * isParenthesesValid('(){}[]'); // true - * isParenthesesValid('([{}])'); // true - * isParenthesesValid('([{)}]'); // false - * - * @param {string} string - The string - */ -function isParenthesesValid(string) { - // end::description[] - // tag::solution[] - const map = new Map([['(', ')'], ['{', '}'], ['[', ']']]); - const stack = []; - - for (const c of string) { - if (map.has(c)) stack.push(map.get(c)); - else if (c !== stack.pop()) return false; - } - - return stack.length === 0; -} -// end::solution[] - -module.exports = { isParenthesesValid }; diff --git a/book/interview-questions/valid-parentheses.spec.js b/book/interview-questions/valid-parentheses.spec.js deleted file mode 100644 index fcb392f3..00000000 --- a/book/interview-questions/valid-parentheses.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -const { isParenthesesValid } = require('./valid-parentheses'); - -describe('Stack: Valid Parentheses', () => { - it('should be valid', () => { - expect(isParenthesesValid('()')).toEqual(true); - }); - - it('should be valid with different kinds', () => { - expect(isParenthesesValid('()[]{}')).toEqual(true); - }); - - it('should be valid with different nested kinds', () => { - expect(isParenthesesValid('([{}])')).toEqual(true); - }); - - it('should not be valid if incomplete', () => { - expect(isParenthesesValid('()(')).toEqual(false); - }); - - it('should not be valid if invalid character is present', () => { - expect(isParenthesesValid('()-')).toEqual(false); - }); -}); From 4cdfbf559a58102d85d9e88ee661d8279a3f41e4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 26 Aug 2020 20:39:55 +0000 Subject: [PATCH 113/200] :bookmark: chore(release): 1.12.0 # [1.12.0](https://github.com/amejiarosario/dsa.js/compare/1.11.0...1.12.0) (2020-08-26) ### Features * **book/exercises:** interview q&a for linked lists and stacks ([#69](https://github.com/amejiarosario/dsa.js/issues/69)) ([ca4bf45](https://github.com/amejiarosario/dsa.js/commit/ca4bf45369ef772f4861e7619d3ea74ddc41cde4)) ### Reverts * Revert "(book/exercises): interview q&a for linked lists and stacks (#69)" (#70) ([06bd3f6](https://github.com/amejiarosario/dsa.js/commit/06bd3f6a8542b111e4c9e3b5d41050094b153112)), closes [#69](https://github.com/amejiarosario/dsa.js/issues/69) [#70](https://github.com/amejiarosario/dsa.js/issues/70) --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f68e54e6..ab284907 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [1.12.0](https://github.com/amejiarosario/dsa.js/compare/1.11.0...1.12.0) (2020-08-26) + + +### Features + +* **book/exercises:** interview q&a for linked lists and stacks ([#69](https://github.com/amejiarosario/dsa.js/issues/69)) ([ca4bf45](https://github.com/amejiarosario/dsa.js/commit/ca4bf45369ef772f4861e7619d3ea74ddc41cde4)) + + +### Reverts + +* Revert "(book/exercises): interview q&a for linked lists and stacks (#69)" (#70) ([06bd3f6](https://github.com/amejiarosario/dsa.js/commit/06bd3f6a8542b111e4c9e3b5d41050094b153112)), closes [#69](https://github.com/amejiarosario/dsa.js/issues/69) [#70](https://github.com/amejiarosario/dsa.js/issues/70) + # [1.11.0](https://github.com/amejiarosario/dsa.js/compare/1.10.0...1.11.0) (2020-08-22) diff --git a/package-lock.json b/package-lock.json index c148c0af..44eaa54e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.11.0", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 641276ff..045692ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.11.0", + "version": "1.12.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 3bb86fd544f543906b5723aab1f26d5a75f13950 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 26 Aug 2020 16:38:55 -0400 Subject: [PATCH 114/200] feat(book/exercises): interview q&a for linked lists and stacks --- book/D-interview-questions-solutions.asc | 206 +++++++++++++++++- book/config | 2 +- book/content/part02/array.asc | 34 +-- book/content/part02/linked-list.asc | 93 +++++--- book/content/part02/stack.asc | 54 ++++- .../interview-questions/daily-temperatures.js | 48 ++++ .../daily-temperatures.spec.js | 21 ++ .../linkedlist-same-data.js | 83 +++++++ .../linkedlist-same-data.spec.js | 41 ++++ book/interview-questions/max-subarray.js | 1 + book/interview-questions/merge-lists.js | 37 ++++ book/interview-questions/merge-lists.spec.js | 44 ++++ book/interview-questions/valid-parentheses.js | 27 +++ .../valid-parentheses.spec.js | 23 ++ 14 files changed, 658 insertions(+), 56 deletions(-) create mode 100644 book/interview-questions/daily-temperatures.js create mode 100644 book/interview-questions/daily-temperatures.spec.js create mode 100644 book/interview-questions/linkedlist-same-data.js create mode 100644 book/interview-questions/linkedlist-same-data.spec.js create mode 100644 book/interview-questions/merge-lists.js create mode 100644 book/interview-questions/merge-lists.spec.js create mode 100644 book/interview-questions/valid-parentheses.js create mode 100644 book/interview-questions/valid-parentheses.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 7c0c2ad5..5fe1acf1 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -1,3 +1,4 @@ +<<< [appendix] [[d-interview-questions-solutions]] == Interview Questions Solutions @@ -29,7 +30,7 @@ include::interview-questions/max-subarray.js[tag=maxSubArrayBrute1] This code is simple to understand; however, not very efficient. The runtime is `O(n^3)`. -If you noticed we adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. +Notice we're adding up the numbers from `i` to `j` on each cycle. But, we can optimize this. We can keep a local variable and add the new number to it. That way, we don't have to revisit previous numbers. [source, javascript] ---- @@ -46,7 +47,7 @@ include::interview-questions/max-subarray.js[tag=description] include::interview-questions/max-subarray.js[tag=solution] ---- -The runtime is `O(n)` and a space complexity of `O(1)`. +The runtime is `O(n)` and space complexity of `O(1)`. @@ -93,4 +94,203 @@ include::interview-questions/buy-sell-stock.js[tag=description] include::interview-questions/buy-sell-stock.js[tag=solution] ---- -The runtime is `O(n)` and a space complexity of `O(1)`. +The runtime is `O(n)` and space complexity of `O(1)`. + + + +:leveloffset: +1 + +=== Solutions for Linked List Questions +(((Interview Questions Solutions, Linked Lists))) + +:leveloffset: -1 + + + + +[#linkedlist-q-merge-lists] +include::content/part02/linked-list.asc[tag=linkedlist-q-merge-lists] + +We need to visit each node in both lists and merge them in ascending order. Note: We don't need to copy the values nor create new nodes. + +Another case to take into consideration is that lists might have different lengths. So, if one list runs out, we have to keep taking elements from the remaining list. + +*Algorithm*: + +- Have a pointer for each list +- While there's a pointer that is not null, visite them + - Compare each list node's value and take the smaller one. + - Advance the pointer of the taken node to the next one. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/merge-lists.js[tag=description] +include::interview-questions/merge-lists.js[tag=solution] +---- + +Notice that we used a "dummy" node or "sentinel node" to have some starting point for the final list. + +*Complexity Analysis*: + +- Time: `O(m+n)`. Visiting each node from the list 1 and list 2 has a time complexity `O(m + n)`. `m` and `n` represent each list's length. +- Space: `O(1)`. We reuse the same nodes and only change their `next` pointers. We only create one additional node, "the sentinel node." + + +[#linkedlist-q-linkedlist-same-data] +include::content/part02/linked-list.asc[tag=linkedlist-q-linkedlist-same-data] + +We are given two linked lists that contain string data. We want to know if the concatenated strings from each list are the same. + +The tricky part is that the same data can be distributed differently on the linked lists: + +---- +L1: he -> ll -> o +L2: h -> e -> llo +---- + +One naive approach could be to go through each list's node and concatenate the strings. Then, we can check if they are equal. + +[source, javascript] +---- +include::interview-questions/linkedlist-same-data.js[tag=hasSameDataBrute1] +---- + +Notice that the problem mentions that lists could be huge (millions of nodes). If the first character on each list is different, we are unnecessarily computing millions of nodes, when a straightforward check will do the job. + +A better way to solve this problem is iterating over each character on both lists, and when we found mistmatch, we return `false` immediately. If they are the same, we still have to visit all of them. + +*Algorithm*: + +- Set a pointer to iterate over each node in the lists. +- For each node, have an index (starting at zero) and compare if both lists have the same data. + - When the index reaches the last character on the current node, we move to the next node. + - If we found that a character from one list doesn't match the other, we return `false`. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/linkedlist-same-data.js[tag=description] +include::interview-questions/linkedlist-same-data.js[tag=solution] +---- + +The function `findNextPointerIndex` is a helper to navigate each character on a linked list. +Notice, that we increase the index (`i + 1`) on each iteration. +If the index overflows, it moves to the next node and reset the index to zero. + + + +*Complexity Analysis*: + +- Time: `O(n)`. We go over all the characters on each list +- Space: `O(1)`. Only using pointers and no auxiliary data structures. + + + +:leveloffset: +1 + +=== Solutions for Stack Questions +(((Interview Questions Solutions, Stack))) + +:leveloffset: -1 + +[#stack-q-valid-parentheses] +include::content/part02/stack.asc[tag=stack-q-valid-parentheses] + +.We need to validate that brackets are properly opened and closed, following these rules: +- An opened bracket must be close by the same type. +- Open brackets mush be closed in the correct order. + +This is a parsing problem, and usually, stacks are good candidates for them. + +*Algorithm*: + +- Create a mapping for each opening bracket, to its closing counterpart. +- Iterate through the string + - When we found an opening bracket, insert the corresponding closing bracket into the stack. + - When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. +- Check the stack is empty. If there's a leftover, it means that something didn't close properly. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/valid-parentheses.js[tag=description] +include::interview-questions/valid-parentheses.js[tag=solution] +---- + +*Complexity Analysis*: + +- Time: `O(n)`. We iterate over each character of the string. +- Space: `O(n)`. We use an auxiliary stack. + + + +[#stack-q-daily-temperatures] +include::content/part02/stack.asc[tag=stack-q-daily-temperatures] + +The first solution that might come to mind it's using two for loops. For each element, we have visit each temperature ahead to find a bigger one. + +[source, javascript] +---- +include::interview-questions/daily-temperatures.js[tag=dailyTemperaturesBrute1] +---- + +This solution is an `O(n^2)`. Can we do better? We can! + +Here's an idea: start backward, so we know when there's a warmer temperature beforehand. The last element is always 0 (because there are no more temperatures ahead of it). We can place each element's index that we visit on a stack. If the current weather is bigger than the stack top, we remove it until a bigger one remains or the stack is empty. If the stack has a value, we calculate the number of days ahead. Otherwise, it is 0. + +*Algorithm*: + +- Traverse the daily temperatures backward + - Push each temperature to a stack. + - While the current temperature is larger than the one at the top of the stack, pop it. + - If the stack is empty, then there's no warmer weather ahead, so it's 0. + - If the stack has an element, calculate the index delta. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/daily-temperatures.js[tag=description] +include::interview-questions/daily-temperatures.js[tag=solution] +---- + +The stack contains the indexes rather than the temperatures themselves. + +*Complexity Analysis*: + +- Time: `O(n)`. We visit each element on the array once. +- Space: `O(1)`. The worst-case scenario is ascending order without duplicates. The stack will hold at most 70 items (100 - 30). If we didn't have the range restriction, then space complexity would be `O(n)`. + + + +// [#linkedlist-q-FILENAME] +// include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] + +// RESTATE REQUIREMENTS AND DESCRIPTIONS + +// *Algorithm*: + +// - STEP 1 +// - STEP 2 +// - STEP 2.1 +// - STEP 2.2 + +// *Implementation*: + +// [source, javascript] +// ---- +// include::interview-questions/FILENAME.js[tag=description] +// include::interview-questions/FILENAME.js[tag=solution] +// ---- + +// IMPLEMENTATION NOTES + +// *Complexity Analysis*: + +// - Time: `O(?)`. WHY? +// - Space: `O(?)`. WHY? + diff --git a/book/config b/book/config index 1216accf..b4dd20d3 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit 1216accfbd750b835ba92c196aa20ddd3414c515 +Subproject commit b4dd20d3f92beb4dd48445464e1734819a9cd40a diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index 4b2c2c7e..e03863e5 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -7,18 +7,18 @@ endif::[] === Array [[array-chap]] (((Array))) (((Data Structures, Linear, Array))) -Arrays are one of the most used data structures. You probably have used it a lot but are you aware of the runtimes of `splice`, `shift`, `indexOf` and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. +Arrays are one of the most used data structures. You probably have used it a lot, but are you aware of the runtimes of `splice`, `shift`, `indexOf`, and other operations? In this chapter, we are going deeper into the most common operations and their runtimes. ==== Array Basics An array is a collection of things (strings, characters, numbers, objects, etc.). They can be many or zero. -TIP: Strings are a collection of Unicode characters and most of the array concepts apply to them. +TIP: Strings are a collection of Unicode characters, and most of the array concepts apply to them. .Fixed vs. Dynamic Size Arrays **** -Some programming languages have fixed size arrays like Java and {cpp}. -Fixed size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. For that, those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. +Some programming languages have fixed-size arrays like Java and {cpp}. +Fixed-size arrays might be a hassle when your collection gets full, and you have to create a new one with a bigger size. Those programming languages also have built-in dynamic arrays: we have `vector` in {cpp} and `ArrayList` in Java. Dynamic programming languages like JavaScript, Ruby, and Python use dynamic arrays by default. **** Arrays look like this: @@ -26,11 +26,11 @@ Arrays look like this: .Array representation: each value is accessed through an index. image::image16.png[image,width=388,height=110] -Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look into the different operations that we can do with arrays. +Arrays are a sequential collection of elements that can be accessed randomly using an index. Let’s take a look at the different operations that we can do with arrays. ==== Insertion -Arrays are built-in into most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: +Arrays are built-in in most languages. Inserting an element is simple; you can either add them at creation time or after initialization. Below you can find an example for both cases: .Inserting elements into an array [source, javascript] @@ -45,7 +45,7 @@ array2[100] = 2; array2 // [empty × 3, 1, empty × 96, 2] ---- -Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers but the length is 101 and there are 99 empty spaces. +Using the index, you can replace whatever value you want. Also, you don't have to add items next to each other. The size of the array will dynamically expand to accommodate the data. You can reference values at whatever index you like: index 3 or even 100! In `array2`, we inserted 2 numbers, but the length is 101, and there are 99 empty spaces. [source, javascript] ---- @@ -54,7 +54,7 @@ console.log(array2); // [empty × 3, 1, empty × 96, 2] ---- -The runtime for inserting elements using index is always is constant: _O(1)_. +The runtime for inserting elements using an index is always is constant: _O(1)_. ===== Inserting at the beginning of the array @@ -72,7 +72,7 @@ As you can see, `2` was at index 0, now was pushed to index 1, and everything el .JavaScript built-in `array.unshift` **** -The `unshift()` method adds one or more elements to the beginning of an array and returns the new length of the array. +The `unshift()` method adds one or more elements to the beginning of an array and returns the array's new length. Runtime: O(n). **** @@ -90,11 +90,11 @@ array.splice(1, 0, 111); // ↪️ [] <1> ---- <1> at position `1`, delete `0` elements and insert `111`. -The Big O for this operation would be *O(n)* since in worst case it would move most of the elements to the right. +The Big O for this operation would be *O(n)* since, in the worst case, it would move most of the elements to the right. .JavaScript built-in `array.splice` **** -The `splice()` method changes the contents of an array by removing existing elements or adding new elements. Splice returns an array containing the deleted elements. +The `splice()` method changes an array's contents by removing existing elements or adding new elements. Splice returns an array containing the deleted items. Runtime: O(n). **** @@ -116,7 +116,7 @@ Adding to the tail of the array doesn’t change other indexes. E.g., element 2 .JavaScript built-in `array.push` **** -The `push()` method adds one or more elements to the end of an array and returns the new length of the array. +The `push()` method adds one or more elements to the end of an array and returns the array's new length. Runtime: O(1). **** @@ -124,7 +124,7 @@ Runtime: O(1). [[array-search-by-value]] ==== Searching by value and index -Searching by index is very easy using the `[]` operator: +Searching by the index is very easy using the `[]` operator: .Search by index [source, javascript] @@ -185,7 +185,7 @@ We would have to loop through the whole array (worst case) or until we find it: ==== Deletion -There are three possible scenarios for deletion (similar to insertion): removing at the beginning, middle or end. +There are three possible deletion scenarios (similar to insertion): removing at the beginning, middle, or end. ===== Deleting element from the beginning @@ -224,7 +224,7 @@ array.splice(2, 1); // ↪️[2] <1> ---- <1> delete 1 element at position 2 -Deleting from the middle might cause most of the elements of the array to move up one position to fill in for the eliminated item. Thus, runtime: O(n). +Deleting from the middle might cause most of the array elements to move up one position to fill in for the eliminated item. Thus, runtime: O(n). ===== Deleting element from the end @@ -282,7 +282,7 @@ To sum up, the time complexity of an array is: // tag::array-q-max-subarray[] ===== Max Subarray -Given an array of integers, find the maximum sum of consecutive elements (subarray). +*AR-1*) _Given an array of integers, find the maximum sum of consecutive elements (subarray)._ // end::array-q-max-subarray[] [source, javascript] @@ -297,7 +297,7 @@ _Solution: <>_ // tag::array-q-buy-sell-stock[] ===== Best Time to Buy and Sell an Stock -You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximun profit you can obtain? (Note: you have to buy first and then sell) +*AR-2*) _You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximum profit you can obtain? (Note: you have to buy first and then sell)_ // end::array-q-buy-sell-stock[] [source, javascript] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 6e3f3f98..7790c3e4 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -23,7 +23,7 @@ Each element or node is *connected* to the next one by a reference. When a node .Singly Linked List Representation: each node has a reference (blue arrow) to the next one. image::image19.png[image,width=498,height=97] -Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. +Usually, a Linked List is referenced by the first element called *head* (or *root* node). For instance, if you want to get the `cat` element from the example above, then the only way to get there is by using the `next` field on the head node. You would get `art` first, then use the next field recursively until you eventually get the `cat` element. [[doubly-linked-list]] ==== Doubly Linked List @@ -47,9 +47,9 @@ include::{codedir}/data-structures/linked-lists/node.js[tag=snippet] ==== Linked List vs. Array -Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. +Arrays allow you to access data anywhere in the collection using an index. However, Linked List visits nodes in sequential order. In the worst-case scenario, it takes _O(n)_ to get an element from a Linked List. You might be wondering: Isn’t an array always more efficient with _O(1)_ access time? It depends. -We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. When it is getting full, it has to create a bigger array (usually 2x) and copy all the elements. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor large chunks of memory have to be booked beforehand like arrays. Linked List is more on a "grow as you go" basis. +We also have to understand the space complexity to see the trade-offs between arrays and linked lists. An array pre-allocates contiguous blocks of memory. It has to create a larger array (usually 2x) and copy all the elements when it is getting full. It takes _O(n)_ to copy all the items over. On the other hand, LinkedList’s nodes only reserve precisely the amount of memory they need. They don’t have to be next to each other, nor are large chunks of memory booked beforehand like arrays. Linked List is more on a "grow as you go" basis. Another difference is that adding/deleting at the beginning on an array takes O(n); however, the linked list is a constant operation O(1) as we will implement later. @@ -70,7 +70,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=constructor] } ---- -In our constructor, we keep a reference of the `first` and also `last` node for performance reasons. +In our constructor, we reference the `first` and `last` node for performance reasons. ==== Searching by value @@ -84,7 +84,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByValue If we find the element, we will return the index otherwise `undefined`. The runtime for locating an item by value is _O(n)_. -For finding elements by value or position we are using the following helper function: +For finding elements by value or position, we are using the following helper function: .Find elements using a callback [source, javascript] @@ -92,8 +92,8 @@ For finding elements by value or position we are using the following helper func include::{codedir}/data-structures/linked-lists/linked-list.js[tag=find, indent=0] ---- <1> We initialize two variables `current` to the first node and `position` to keep track of the index. -<2> While `current` node is not null we keep going. -<3> On each loop we move to the next node and increment the index. +<2> While the `current` node is not null, we keep going. +<3> On each loop, we move to the next node and increment the index. <4> We invoke the callback passing the current position and node. If the callback returns something, then we stop and return that value. <5> Return whatever result we got from the callback. E.g., we can return the index or the node itself or any other calculation. @@ -101,7 +101,7 @@ We are going to use this `find` method again to implement searching by index. ==== Searching by index -Searching by index is very similar, we iterate through the list until we find the element that matches the position. +Searching by an index is very similar, we iterate through the list until we find the element that matches the position. .Linked List's searching by index (position) [source, javascript] @@ -109,22 +109,22 @@ Searching by index is very similar, we iterate through the list until we find th include::{codedir}/data-structures/linked-lists/linked-list.js[tag=searchByIndex, indent=0] ---- -If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar. If you want to take a look at the whole implementation, https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[click here]. +If there’s no match, we return `undefined` then. The runtime is _O(n)_. As you might notice, the search by index and by position methods looks pretty similar; you want to take a look at the https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac57139ff4/src/data-structures/linked-lists/linked-list.js#L8[full implementation]. ==== Insertion -Similar to the array, with a linked list you can add elements at the beginning, end or anywhere in the middle of the list. So, let's implement each case. +In a linked list, you can add elements at the beginning, end, or anywhere in the middle of the list. So, let's implement each case. [[linked-list-inserting-beginning]] ===== Inserting elements at the beginning of the list -We are going to use the `Node` class to create a new element and stick it at the beginning of the list as shown below. +We will use the `Node` class to create a new element and stick it at the beginning of the list, as shown below. .Insert at the beginning by linking the new node with the current first node. image::image23.png[image,width=498,height=217] -To insert at the beginning, we create a new node with the next reference to the current first node. Then we make first the new node. In code, it would look something like this: +To insert at the beginning, we create a new node with the next reference to the current first node. Then we first make the new node. In code, it would look something like this: .Add item to the beginning of a Linked List [source, javascript] @@ -137,7 +137,7 @@ As you can see, we create a new node and make it the first one. ===== Inserting element at the end of the list -Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item in the list. Otherwise, you would have to iterate through the whole list. +Appending an element at the end of the list can be done very effectively if we have a pointer to the `last` item. Otherwise, you would have to iterate through the whole list. .Add element to the end of the linked list image::image24.png[image,width=498,height=208] @@ -148,12 +148,12 @@ image::image24.png[image,width=498,height=208] include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addLast, indent=0] ---- -If there’s no element in the list yet, the first and last node would be the same. If there’s something, then, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. +If there’s no element in the list yet, the first and last node would be the same. If there’s something, we go to the `last` item and add the reference `next` to the new node. That’s it! We got a constant time for inserting at the beginning and the end of the list: *O(1)*. ===== Inserting element at the middle of the list -For inserting an element at the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. +For inserting an element in the middle of the list, you would need to specify the position (index) in the collection. Then, you create the new node and update the references to it. .There are 4 references to update: . New node's `next`. @@ -168,7 +168,7 @@ Let’s do an example with the following doubly linked list: art <-> dog <-> cat ---- -We want to insert the `new` node in the 2^nd^ position. For that we first create the "new" node and update the references around it. +We want to insert the `new` node in the 2^nd^ position. For that, we first create the "new" node and update the references around it. .Inserting node in the middle of a doubly linked list. image::image25.png[image,width=528,height=358] @@ -181,11 +181,11 @@ Take a look into the implementation of https://github.com/amejiarosario/dsa.js/b include::{codedir}/data-structures/linked-lists/linked-list.js[tag=addMiddle, indent=0] ---- <1> If the new item goes to position 0, then we reuse the `addFirst` method, and we are done! -<2> However, if we are adding to the last position, then we reuse the `addLast` method, and done! -<3> Adding `newNode` to the middle: First, create the `new` node only if the position exists. Take a look at <> to see `get` implementation. +<2> However, if we add to the last position, we reuse the `addLast` method and done! +<3> Adding `newNode` to the middle: First, create the `new` node only if it exists. Take a look at <> to see `get` implementation. <4> Set newNode `previous` reference. <5> Set newNode `next` link. -<6> No other node in the list is pointing to `newNode`, so we have to make the prior element point to `newNode`. +<6> No other node in the list points to `newNode`, so we have to make the prior element point to `newNode`. <7> Make the next element point to `newNode`. Take notice that we reused `addFirst` and `addLast` methods. For all the other cases, the insertion is in the middle. We use `current.previous.next` and `current.next` to update the surrounding elements and make them point to the new node. Inserting in the middle takes *O(n)* because we have to iterate through the list using the `get` method. @@ -219,7 +219,7 @@ Removing the last element from the list would require to iterate from the head u image::image27.png[image,width=528,height=221] -For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat”. Since nothing is pointing to “cat”, it is out of the list and eventually is deleted from memory by the garbage collector. +For instance, if we want to remove the last node “cat”. We use the last pointer to avoid iterating through the whole list. We check `last.previous` to get the “dog” node and make it the new `last` and remove its next reference to “cat.” Since nothing is pointing to “cat” it is out of the list and eventually is deleted from memory by the garbage collector. .Linked List's remove from the end of the list [source, javascript] @@ -228,7 +228,7 @@ include::{codedir}/data-structures/linked-lists/linked-list.js[tag=removeLast, i ---- -The code is very similar to `removeFirst`, but instead of first we update `last` reference, and instead of nullifying `previous` we nullify its `next` reference. +The code is very similar to `removeFirst`, but instead of first, we update `last` reference, and instead of nullifying `previous`, we nullify its `next` reference. ===== Deleting element from the middle @@ -238,7 +238,7 @@ To remove a node from the middle, we make the surrounding nodes to bypass the on image::image28.png[image,width=528,height=259] -In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art”, totally bypassing “dog”. +In the illustration, we are removing the middle node “dog” by making art’s `next` variable to point to cat and cat’s `previous` to be “art,” totally bypassing “dog.” Let’s implement it: @@ -252,7 +252,7 @@ Notice that we are using the `get` method to get the node at the current positio ==== Linked List Complexity vs. Array Complexity -So far, we have seen two liner data structures with different use cases. Here’s a summary: +So far, we have seen two-liner data structures with different use cases. Here’s a summary: (((Tables, Linear DS, Array/Lists complexities))) // tag::table[] @@ -268,9 +268,9 @@ So far, we have seen two liner data structures with different use cases. Here’ (((Linear))) (((Runtime, Linear))) -If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly linked list is *O(1)*. +If you compare the singly linked list vs. doubly linked list, you will notice that the main difference is inserting elements to and deleting elements from the end. For a singly linked list, it's *O(n)*, while a doubly-linked list is *O(1)*. -Comparing an array with a doubly linked list, both have different use cases: +Comparing an array with a doubly-linked list, both have different use cases: Use arrays when: @@ -282,10 +282,45 @@ Use a doubly linked list when: * You want to access elements in a *sequential* manner only like <> or <>. * You want to insert elements at the start and end of the list. The linked list has O(1) while array has O(n). -* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go”. +* You want to save some memory when dealing with possibly large data sets. Arrays pre-allocate a large chunk of contiguous memory on initialization. Lists are more “grow as you go.” -For the next two linear data structures <> and <>, we are going to use a doubly linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we are going use that. +For the next two linear data structures <> and <>, we are going to use a doubly-linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we will use that. -==== Linked List Exercises +==== Interview Questions +(((Interview Questions, Arrays))) -1) Merge two sorted lists into one (and keep them sorted) + + + +// tag::linkedlist-q-merge-lists[] +===== Merge Linked Lists into One + +*LL-1*) _Merge two sorted lists into one (and keep them sorted)_ +// end::linkedlist-q-merge-lists[] + +[source, javascript] +---- +include::../../interview-questions/merge-lists.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ + + + + +// tag::linkedlist-q-linkedlist-same-data[] +===== Check if two strings lists are the same + +*LL-2*) _Given two linked lists with strings, check if are the same_ +// end::linkedlist-q-linkedlist-same-data[] + +[source, javascript] +---- +include::../../interview-questions/linkedlist-same-data.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 81ced6f2..02643814 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -11,7 +11,7 @@ endif::[] (((LIFO))) The stack is a data structure that restricts the way you add and remove data. It only allows you to insert and retrieve in a *Last-In-First-Out* (LIFO) fashion. -An analogy is to think that the stack is a rod and the data are discs. You can only take out the last one you put in. +An analogy is to think that the stack is a rod, and the data are discs. You can only take out the last one you put in. .Stack data structure is like a stack of disks: the last element in is the first element out image::image29.png[image,width=240,height=238] @@ -20,7 +20,7 @@ image::image29.png[image,width=240,height=238] As you can see in the image above, If you insert the disks in the order `5`, `4`, `3`, `2`, `1`, then you can remove them in `1`, `2`, `3`, `4`, `5`. -The stack inserts items to the end of the collection and also removes from the end. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. +The stack inserts items to the end of the collection and also removes it from the rear. Both an array and linked list would do it in constant time. However, since we don’t need the Array’s random access, a linked list makes more sense. .Stack's constructor [source, javascript] @@ -30,7 +30,7 @@ include::{codedir}/data-structures/stacks/stack.js[tag=constructor] } ---- -As you can see in the stack constructor, we are using a linked list as the underlying data structure. +As you can see in the stack constructor, we use a linked list as the underlying data structure. Let's now develop the insert and remove operations in a stack. @@ -48,7 +48,7 @@ We are returning `this`, in case we want to chain multiple add commands. ==== Deletion -Deleting is straightforward as well. +Deleting is straightforward, as well. .Stack's remove [source, javascript] @@ -56,7 +56,7 @@ Deleting is straightforward as well. include::{codedir}/data-structures/stacks/stack.js[tag=remove, indent=0] ---- -This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the full implementation https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[here]. +This time we used the linked list’s `removeLast` method. That’s all we need for a stack implementation. Check out the https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/stacks/stack.js#L6[full implementation]. ==== Implementation Usage @@ -68,7 +68,7 @@ We can use our stack implementation as follows: include::{codedir}/data-structures/stacks/stack.js[tag=snippet, indent=0] ---- -As you can see if we add new items they will be the first to go out to honor LIFO. +As you can see, if we add new items, they will be the first to go out to honor LIFO. ==== Stack Complexity @@ -85,3 +85,45 @@ Implementing the stack with an array and linked list would lead to the same time // end::table[] It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks are especially useful for implementing <>. + + +==== Interview Questions +(((Interview Questions, Arrays))) + + + + + +// tag::stack-q-valid-parentheses[] +===== Validate Parentheses / Braces / Brackets + +*ST-1*) _Given an string with 3 types of brakets: `()`, `{}`, and `[]`. Validate they are properly closed and opened._ +// end::stack-q-valid-parentheses[] + +[source, javascript] +---- +include::../../interview-questions/valid-parentheses.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ + + + + + +// tag::stack-q-daily-temperatures[] +===== Daily Temperaturs + +*ST-2*) _Given an array of integers from 30 to 100 (daily temperatures), return another array that for each day in the input, tells you how many days you would have to wait until a warmer temperature. If no warmer temperature is possible then return `0` for that element._ +// end::stack-q-daily-temperatures[] + +[source, javascript] +---- +include::../../interview-questions/daily-temperatures.js[tag=description] + // write you code here +} +---- + +_Solution: <>_ diff --git a/book/interview-questions/daily-temperatures.js b/book/interview-questions/daily-temperatures.js new file mode 100644 index 00000000..5a4b4613 --- /dev/null +++ b/book/interview-questions/daily-temperatures.js @@ -0,0 +1,48 @@ +// tag::description[] +/** + * Given an array with daily temperatures (30 °C to 100 °C), + * return an array with the days count until a warmer temperature + * for each elem from the input. + * + * @examples + * dailyTemperatures([30, 28, 50, 40, 30]); // [2, 1, 0, 0, 0] + * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] + * + * @param {number[]} t - Daily temperatures + */ +function dailyTemperatures(t) { + // end::description[] + // tag::solution[] + const last = (arr) => arr[arr.length - 1]; + const stack = []; + const ans = []; + + for (let i = t.length - 1; i >= 0; i--) { + while (stack.length && t[i] >= t[last(stack)]) stack.pop(); + ans[i] = stack.length ? last(stack) - i : 0; + stack.push(i); + } + + return ans; +} +// end::solution[] + +// tag::dailyTemperaturesBrute1[] +function dailyTemperaturesBrute1(t) { + const ans = []; + + for (let i = 0; i < t.length; i++) { + ans[i] = 0; + for (let j = i + 1; j < t.length; j++) { + if (t[j] > t[i]) { + ans[i] = j - i; + break; + } + } + } + + return ans; +} +// end::dailyTemperaturesBrute1[] + +module.exports = { dailyTemperatures, dailyTemperaturesBrute1 }; diff --git a/book/interview-questions/daily-temperatures.spec.js b/book/interview-questions/daily-temperatures.spec.js new file mode 100644 index 00000000..3ff950d7 --- /dev/null +++ b/book/interview-questions/daily-temperatures.spec.js @@ -0,0 +1,21 @@ +const { dailyTemperatures } = require('./daily-temperatures'); + +describe('Stack: Daily Temperatures', () => { + it('should work', () => { + expect(dailyTemperatures([30, 28, 50, 40, 30])).toEqual([2, 1, 0, 0, 0]); + }); + + it('should work', () => { + expect(dailyTemperatures([73, 74, 75, 71, 69, 72, 76, 73])).toEqual([1, 1, 4, 2, 1, 1, 0, 0]); + }); + + it('should work', () => { + expect(dailyTemperatures([89, 62, 70, 58, 47, 47, 46, 76, 100, 70])).toEqual([8, 1, 5, 4, 3, 2, 1, 1, 0, 0]); + }); + + it('should work with large data', () => { + const input = [64, 40, 49, 73, 72, 35, 68, 83, 35, 73, 84, 88, 96, 43, 74, 63, 41, 95, 48, 46, 89, 72, 34, 85, 72, 59, 87, 49, 30, 32, 47, 34, 74, 58, 31, 75, 73, 88, 64, 92, 83, 64, 100, 99, 81, 41, 48, 83, 96, 92, 82, 32, 35, 68, 68, 92, 73, 92, 52, 33, 44, 38, 47, 88, 71, 50, 57, 95, 33, 65, 94, 44, 47, 79, 41, 74, 50, 67, 97, 31, 68, 50, 37, 70, 77, 55, 48, 30, 77, 100, 31, 100, 69, 60, 47, 95, 68, 47, 33, 64]; + const output = [3, 1, 1, 4, 3, 1, 1, 3, 1, 1, 1, 1, 30, 1, 3, 2, 1, 25, 2, 1, 19, 2, 1, 3, 2, 1, 11, 5, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 1, 3, 2, 1, 0, 46, 3, 1, 1, 1, 30, 18, 5, 1, 1, 2, 1, 12, 1, 10, 5, 1, 2, 1, 1, 4, 3, 1, 1, 11, 1, 1, 8, 1, 1, 5, 1, 3, 1, 1, 11, 1, 3, 2, 1, 1, 5, 3, 2, 1, 1, 0, 1, 0, 3, 2, 1, 0, 0, 2, 1, 0]; + expect(dailyTemperatures(input)).toEqual(output); + }); +}); diff --git a/book/interview-questions/linkedlist-same-data.js b/book/interview-questions/linkedlist-same-data.js new file mode 100644 index 00000000..fd303d36 --- /dev/null +++ b/book/interview-questions/linkedlist-same-data.js @@ -0,0 +1,83 @@ +// const ListNode = require('../../src/data-structures/linked-lists/node'); + +// tag::description[] +/** + * Check if two lists has the same string data. + * Note: each lists can be huge, they have up to 10 million nodes. + * + * @examples + * hasSameData(['he', 'll', 'o'], ['hel', 'lo']); // true + * hasSameData(['hel', 'lo'], ['hi']); // false + * + * @param {ListNode} l1 - The root node of list 1 + * @param {ListNode} l2 - The root node of list 2 + */ +function hasSameData(l1, l2) { + // end::description[] + // tag::solution[] + let p1 = l1; + let p2 = l2; + let i1 = -1; + let i2 = -1; + + const findNextPointerIndex = (p, i) => { + let node = p; + let index = i; + while (node && index >= node.value.length) { + node = node.next; + index = 0; + } + return [node, index]; + }; + + while (p1 && p2) { + [p1, i1] = findNextPointerIndex(p1, i1 + 1); + [p2, i2] = findNextPointerIndex(p2, i2 + 1); + if ((p1 && p2 && p1.value[i1] !== p2.value[i2]) + || ((!p1 || !p2) && p1 !== p2)) return false; + } + return true; +} +// end::solution[] + +// tag::hasSameDataBrute1[] +function hasSameDataBrute1(l1, l2) { + function toString(node) { + const str = []; + for (let curr = node; curr; curr = curr.next) { + str.push(curr.value); + } + return str.join(''); + } + + // console.log({s1: toString(l1), s2: toString(l2) }); + return toString(l1) === toString(l2); +} +// end::hasSameDataBrute1[] + +function hasSameData1(l1, l2) { + let p1 = l1; + let p2 = l2; + + let i1 = 0; + let i2 = 0; + + while (p1 || p2) { + if (!p1 || !p2 || p1.value[i1] !== p2.value[i2]) return false; + + if (i1 < p1.value.length - 1) i1++; + else { + p1 = p1.next; + i1 = 0; + } + + if (i2 < p2.value.length - 1) i2++; + else { + p2 = p2.next; + i2 = 0; + } + } + return true; +} + +module.exports = { hasSameData, hasSameDataBrute1, hasSameData1 }; diff --git a/book/interview-questions/linkedlist-same-data.spec.js b/book/interview-questions/linkedlist-same-data.spec.js new file mode 100644 index 00000000..c0d26830 --- /dev/null +++ b/book/interview-questions/linkedlist-same-data.spec.js @@ -0,0 +1,41 @@ +const { hasSameData } = require('./linkedlist-same-data'); +const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); + +describe('Linked List: has same data', () => { + it('should work with same data and shape', () => { + const l1 = new LinkedList(['hi']).first; + const l2 = new LinkedList(['hi']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + it('should work with different data', () => { + const l1 = new LinkedList(['ab']).first; + const l2 = new LinkedList(['a']).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); + + it('should work with same data and but different shape', () => { + const l1 = new LinkedList(['h', 'e', 'l', 'l', 'o']).first; + const l2 = new LinkedList(['hello']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + it('should work with different data', () => { + const l1 = new LinkedList(['he', 'll', 'o']).first; + const l2 = new LinkedList(['ho', 'la']).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); + + it('should handle empty', () => { + const l1 = new LinkedList(['hi']).first; + const l2 = new LinkedList(['', 'h', '', 'i']).first; + expect(hasSameData(l1, l2)).toEqual(true); + }); + + xit('should work with large data', () => { + const size = 1e6; // 1e7 takes 4sec. + const l1 = new LinkedList(Array(size).fill('x')).first; + const l2 = new LinkedList(Array(size).fill('z')).first; + expect(hasSameData(l1, l2)).toEqual(false); + }); +}); diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js index 3684740a..0245702f 100644 --- a/book/interview-questions/max-subarray.js +++ b/book/interview-questions/max-subarray.js @@ -4,6 +4,7 @@ * @examples * maxSubArray([1, -3, 10, -5]); // => 10 * maxSubArray([-3,4,-1,2,1,-5]); // => 6 + * * @param {number[]} a - Array */ function maxSubArray(a) { diff --git a/book/interview-questions/merge-lists.js b/book/interview-questions/merge-lists.js new file mode 100644 index 00000000..ad26c326 --- /dev/null +++ b/book/interview-questions/merge-lists.js @@ -0,0 +1,37 @@ +const ListNode = require('../../src/data-structures/linked-lists/node'); +// tag::description[] +/** + * Given two sorted linked lists merge them while keeping the asc order. + * @examples + * mergeTwoLists([2,4,6], [1,3]); // => [1,2,3,4,6] + * mergeTwoLists([2,4,6], []); // => [2,4,6] + * mergeTwoLists([], [1,3]); // => [1,3] + * + * @param {ListNode} l1 - The root node of list 1 + * @param {ListNode} l2 - The root node of list 2 + */ +function mergeTwoLists(l1, l2) { + // end::description[] + // tag::solution[] + const sentinel = new ListNode(); + let p0 = sentinel; + let p1 = l1; + let p2 = l2; + + while (p1 || p2) { + if (!p1 || (p2 && p1.value > p2.value)) { + p0.next = p2; + p2 = p2.next; + } else { + p0.next = p1; + p1 = p1.next; + } + p0 = p0.next; + } + + return sentinel.next; +} +// end::solution[] + + +module.exports = { mergeTwoLists }; diff --git a/book/interview-questions/merge-lists.spec.js b/book/interview-questions/merge-lists.spec.js new file mode 100644 index 00000000..4b06e8ee --- /dev/null +++ b/book/interview-questions/merge-lists.spec.js @@ -0,0 +1,44 @@ +const { mergeTwoLists } = require('./merge-lists'); +const LinkedList = require('../../src/data-structures/linked-lists/linked-list'); + +describe('Linked List: Merge Lists', () => { + function asString(root) { + const values = []; + for (let curr = root; curr; curr = curr.next) { + values.push(curr.value); + } + return values.join(' -> '); + } + + it('should merge in asc order', () => { + const l1 = new LinkedList([2, 3, 4]).first; + const l2 = new LinkedList([1, 2]).first; + const actual = mergeTwoLists(l1, l2); + const expected = '1 -> 2 -> 2 -> 3 -> 4'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty list 1', () => { + const l1 = new LinkedList().first; + const l2 = new LinkedList([1, 2]).first; + const actual = mergeTwoLists(l1, l2); + const expected = '1 -> 2'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty list 1', () => { + const l1 = new LinkedList([2, 3, 4]).first; + const l2 = new LinkedList().first; + const actual = mergeTwoLists(l1, l2); + const expected = '2 -> 3 -> 4'; + expect(asString(actual)).toEqual(expected); + }); + + it('should handle empty lists', () => { + const l1 = new LinkedList().first; + const l2 = new LinkedList().first; + const actual = mergeTwoLists(l1, l2); + const expected = ''; + expect(asString(actual)).toEqual(expected); + }); +}); diff --git a/book/interview-questions/valid-parentheses.js b/book/interview-questions/valid-parentheses.js new file mode 100644 index 00000000..a822a214 --- /dev/null +++ b/book/interview-questions/valid-parentheses.js @@ -0,0 +1,27 @@ +// tag::description[] +/** + * Validate if the parentheses are opened and closed in the right order. + * + * @example + * isParenthesesValid('(){}[]'); // true + * isParenthesesValid('([{}])'); // true + * isParenthesesValid('([{)}]'); // false + * + * @param {string} string - The string + */ +function isParenthesesValid(string) { + // end::description[] + // tag::solution[] + const map = new Map([['(', ')'], ['{', '}'], ['[', ']']]); + const stack = []; + + for (const c of string) { + if (map.has(c)) stack.push(map.get(c)); + else if (c !== stack.pop()) return false; + } + + return stack.length === 0; +} +// end::solution[] + +module.exports = { isParenthesesValid }; diff --git a/book/interview-questions/valid-parentheses.spec.js b/book/interview-questions/valid-parentheses.spec.js new file mode 100644 index 00000000..fcb392f3 --- /dev/null +++ b/book/interview-questions/valid-parentheses.spec.js @@ -0,0 +1,23 @@ +const { isParenthesesValid } = require('./valid-parentheses'); + +describe('Stack: Valid Parentheses', () => { + it('should be valid', () => { + expect(isParenthesesValid('()')).toEqual(true); + }); + + it('should be valid with different kinds', () => { + expect(isParenthesesValid('()[]{}')).toEqual(true); + }); + + it('should be valid with different nested kinds', () => { + expect(isParenthesesValid('([{}])')).toEqual(true); + }); + + it('should not be valid if incomplete', () => { + expect(isParenthesesValid('()(')).toEqual(false); + }); + + it('should not be valid if invalid character is present', () => { + expect(isParenthesesValid('()-')).toEqual(false); + }); +}); From 263c9dce234bdf59f4254470c19a7aed0324ad2b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 26 Aug 2020 20:43:57 +0000 Subject: [PATCH 115/200] :bookmark: chore(release): 1.13.0 # [1.13.0](https://github.com/amejiarosario/dsa.js/compare/1.12.0...1.13.0) (2020-08-26) ### Features * **book/exercises:** interview q&a for linked lists and stacks ([3bb86fd](https://github.com/amejiarosario/dsa.js/commit/3bb86fd544f543906b5723aab1f26d5a75f13950)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab284907..ee461a8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.13.0](https://github.com/amejiarosario/dsa.js/compare/1.12.0...1.13.0) (2020-08-26) + + +### Features + +* **book/exercises:** interview q&a for linked lists and stacks ([3bb86fd](https://github.com/amejiarosario/dsa.js/commit/3bb86fd544f543906b5723aab1f26d5a75f13950)) + # [1.12.0](https://github.com/amejiarosario/dsa.js/compare/1.11.0...1.12.0) (2020-08-26) diff --git a/package-lock.json b/package-lock.json index 44eaa54e..66f93610 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.12.0", + "version": "1.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 045692ee..5e0b002b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.12.0", + "version": "1.13.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 04aa9db26659058c09debe985f94845933a2089d Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Aug 2020 15:40:19 -0400 Subject: [PATCH 116/200] feat(queue): add front, back and peek methods --- src/data-structures/queues/queue.js | 54 ++++++++++++++++-------- src/data-structures/queues/queue.spec.js | 24 +++++++++++ 2 files changed, 61 insertions(+), 17 deletions(-) diff --git a/src/data-structures/queues/queue.js b/src/data-structures/queues/queue.js index 9b4e4bd9..b62c57ae 100644 --- a/src/data-structures/queues/queue.js +++ b/src/data-structures/queues/queue.js @@ -1,18 +1,31 @@ const LinkedList = require('../linked-lists/linked-list'); +/* Usage Example: +// tag::snippet[] +const queue = new Queue(); + +queue.enqueue('a'); +queue.enqueue('b'); +queue.dequeue(); //↪️ a +queue.enqueue('c'); +queue.dequeue(); //↪️ b +queue.dequeue(); //↪️ c +// end::snippet[] +// */ + // tag::constructor[] /** * Data structure where we add and remove elements in a first-in, first-out (FIFO) fashion */ class Queue { - constructor() { - this.items = new LinkedList(); + constructor(iterable = []) { + this.items = new LinkedList(iterable); } // end::constructor[] // tag::enqueue[] /** - * Add element to the queue + * Add element to the back of the queue. * Runtime: O(1) * @param {any} item * @returns {queue} instance to allow chaining. @@ -25,7 +38,7 @@ class Queue { // tag::dequeue[] /** - * Remove element from the queue + * Remove element from the front of the queue. * Runtime: O(1) * @returns {any} removed value. */ @@ -47,23 +60,30 @@ class Queue { isEmpty() { return !this.items.size; } + + /** + * Return the most recent value or null if empty. + */ + back() { + if (this.isEmpty()) return null; + return this.items.last.value; + } + + /** + * Return oldest value from the queue or null if empty. + * (Peek at the next value to be dequeue) + */ + front() { + if (this.isEmpty()) return null; + return this.items.first.value; + } } // Aliases +Queue.prototype.peek = Queue.prototype.front; Queue.prototype.add = Queue.prototype.enqueue; +Queue.prototype.push = Queue.prototype.enqueue; Queue.prototype.remove = Queue.prototype.dequeue; +Queue.prototype.pop = Queue.prototype.dequeue; module.exports = Queue; - -/* Usage Example: -// tag::snippet[] -const queue = new Queue(); - -queue.enqueue('a'); -queue.enqueue('b'); -queue.dequeue(); //↪️ a -queue.enqueue('c'); -queue.dequeue(); //↪️ b -queue.dequeue(); //↪️ c -// end::snippet[] -// */ diff --git a/src/data-structures/queues/queue.spec.js b/src/data-structures/queues/queue.spec.js index e6c6d050..289e0e39 100644 --- a/src/data-structures/queues/queue.spec.js +++ b/src/data-structures/queues/queue.spec.js @@ -46,4 +46,28 @@ describe('Queue', () => { expect(queue.isEmpty()).toBe(false); }); }); + + describe('#back', () => { + it('should return null if empty', () => { + expect(queue.back()).toEqual(null); + }); + + it('should return newest element', () => { + queue.enqueue('oldest'); + queue.enqueue('newest'); + expect(queue.back()).toEqual('newest'); + }); + }); + + describe('#front', () => { + it('should return null if empty', () => { + expect(queue.front()).toEqual(null); + }); + + it('should return oldest element', () => { + queue.enqueue('oldest'); + queue.enqueue('newest'); + expect(queue.front()).toEqual('oldest'); + }); + }); }); From 9a887660bd21e7dbda0d3e87af704b4e41874093 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 28 Aug 2020 15:41:16 -0400 Subject: [PATCH 117/200] feat(book/queue): add solution for queue question --- book/D-interview-questions-solutions.asc | 70 +++++++++++++++ book/content/part02/linked-list.asc | 5 +- book/content/part02/queue.asc | 38 ++++++++ book/content/part02/stack.asc | 6 +- book/interview-questions/design-snake-game.js | 86 +++++++++++++++++++ .../design-snake-game.spec.js | 31 +++++++ 6 files changed, 227 insertions(+), 9 deletions(-) create mode 100644 book/interview-questions/design-snake-game.js create mode 100644 book/interview-questions/design-snake-game.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 5fe1acf1..13a7ee85 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -267,6 +267,76 @@ The stack contains the indexes rather than the temperatures themselves. +:leveloffset: +1 + +=== Solutions for Queue Questions +(((Interview Questions Solutions, Queue))) + +:leveloffset: -1 + + +[#queue-q-design-snake-game] +include::content/part02/queue.asc[tag=queue-q-design-snake-game] + +This game is perfect to practice working with Queues. There are at least two opportunities to use a Queue. One for the food location and another for the snake body part movements. One very move, we insert a new position into the snake and dequeue the last position to indicate the snake moved. Everytime the snake eats food, it grows one more unit, the food gets dequeue and we place the location of next food (if any). + +*Algorithm*: + +- Based on the snake head current position, calculate the next position based on the given move `direction`. +- If the new position is outside the boundaries, game over(return -1) +- If the new position has food, remove that eaten food from its queue and go to the next. +- If the new position doesn't have food, remove the tail of the snake since it moved. +- If the snake new position hits itself, game over (return -1). To make this check we have to options: + - Queue: we can visit all the elements on snake queue (body) and check if new position collide. That's `O(n)` + - Set: we can maintain a `set` that has all the snake locations so the check is `O(1)`. +- Move the snake head to new location (enqueue) +- Return the score (snake's length - 1); + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/design-snake-game.js[tag=description] +include::interview-questions/design-snake-game.js[tag=solution] +---- + +As you can see we opted for using a set to trade speed for memory. + +*Complexity Analysis*: + +- Time: `O(1)`. Insert/Remove from Queue is constant time. Check body collisions is `O(1)` as well when using a set. If you traversed the snake queue, it would be `O(n)`, where `n` is the max length of the snake which is the size of the screen (height x width). +- Space: `O(n + m)`. `m` is the number of food items and `n` is the maximun size of the snake which is (height x width). + + +[#queue-q-FILENAME] +include::content/part02/queue.asc[tag=queue-q-FILENAME] + +RESTATE REQUIREMENTS AND DESCRIPTIONS + +*Algorithm*: + +- STEP 1 +- STEP 2 + - STEP 2.1 + - STEP 2.2 + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/FILENAME.js[tag=description] +include::interview-questions/FILENAME.js[tag=solution] +---- + +IMPLEMENTATION NOTES + +*Complexity Analysis*: + +- Time: `O(?)`. WHY? +- Space: `O(?)`. WHY? + + + // [#linkedlist-q-FILENAME] // include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 7790c3e4..71b68c82 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -287,10 +287,7 @@ Use a doubly linked list when: For the next two linear data structures <> and <>, we are going to use a doubly-linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we will use that. ==== Interview Questions -(((Interview Questions, Arrays))) - - - +(((Interview Questions, Linked Lists))) // tag::linkedlist-q-merge-lists[] ===== Merge Linked Lists into One diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index aab404a7..46793934 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -81,3 +81,41 @@ As an experiment, we can see in the following table that if we had implemented t |=== // end::table[] indexterm:[Runtime, Linear] + + +==== Interview Questions +(((Interview Questions, Queue))) + +// tag::queue-q-design-snake-game[] +===== Design Snake Game + +*QU-1*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for game over._ +// end::queue-q-design-snake-game[] + +_Question seen at: Amazon, Bloomberg, Apple_ + +[source, javascript] +---- +include::../../interview-questions/design-snake-game.js[tag=description] +---- + +_Solution: <>_ + + + + + +// // tag::queue-q-name-2[] +// ===== NAME2 + +// *QU-2*) _DESCRIPTION_ +// // end::queue-q-name-2[] + +// [source, javascript] +// ---- +// include::../../interview-questions/name-2.js[tag=description] +// // write you code here +// } +// ---- + +// _Solution: <>_ diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index 02643814..ae00254b 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -88,11 +88,7 @@ It's not very common to search for values on a stack (other Data Structures are ==== Interview Questions -(((Interview Questions, Arrays))) - - - - +(((Interview Questions, Stack))) // tag::stack-q-valid-parentheses[] ===== Validate Parentheses / Braces / Brackets diff --git a/book/interview-questions/design-snake-game.js b/book/interview-questions/design-snake-game.js new file mode 100644 index 00000000..6d9d7cf3 --- /dev/null +++ b/book/interview-questions/design-snake-game.js @@ -0,0 +1,86 @@ +const { Queue } = require('../../src/index'); + +// tag::description[] +/** + * The snake game stars with a snake of length 1 at postion 0,0. + * Only one food position is shown at a time. Once it's eaten the next one shows up. + * The snake can move in four directions up, down, left and right. + * If the snake go out of the boundaries (width x height) the game is over. + * If the snake hit itself the game is over. + * When the game is over, the `move` method returns -1 otherwise, return the current score. + * + * @example + * const snakeGame = new SnakeGame(3, 2, [[1, 2], [0, 1]]); + * snakeGame.move('R'); // 0 + * snakeGame.move('D'); // 0 + * snakeGame.move('R'); // 0 + * snakeGame.move('U'); // 1 (ate the food1) + * snakeGame.move('L'); // 2 (ate the food2) + * snakeGame.move('U'); // -1 (hit the upper wall) + */ +class SnakeGame { +// end::description[] +// tag::solution[] + + // end::solution[] + // tag::description[] + /** + * Initialize game with grid's dimension and food order. + * @param {number} width - The screen width (grid's columns) + * @param {number} height - Screen height (grid's rows) + * @param {number[]} food - Food locations. + */ + constructor(width, height, food) { + // end::description[] + // tag::solution[] + this.width = width; + this.height = height; + this.food = new Queue(food); + this.snake = new Queue([[0, 0]]); + this.tail = new Set([[0, 0]]); + this.dirs = { + U: [-1, 0], D: [1, 0], R: [0, 1], L: [0, -1], + }; + // end::solution[] + // tag::description[] + } + // end::description[] + + // tag::description[] + /** + * Move snake 1 position into the given direction. + * It returns the score or game over (-1) if the snake go out of bound or hit itself. + * @param {string} direction - 'U' = Up, 'L' = Left, 'R' = Right, 'D' = Down. + * @returns {number} - The current score (snake.length - 1). + */ + move(direction) { + // end::description[] + // tag::solution[] + let [r, c] = this.snake.back(); // head of the snake + [r, c] = [r + this.dirs[direction][0], c + this.dirs[direction][1]]; + + // check wall collision + if (r < 0 || c < 0 || r >= this.height || c >= this.width) return -1; + + const [fr, fc] = this.food.front() || []; // peek + if (r === fr && c === fc) { + this.food.dequeue(); // remove eaten food. + } else { + this.snake.dequeue(); // remove snake's if not food was eaten + this.tail.delete(this.tail.keys().next().value); + } + + // check collision with snake's tail + if (this.tail.has(`${r},${c}`)) return -1; // O(1) + + this.snake.enqueue([r, c]); // add new position + this.tail.add(`${r},${c}`); + + return this.snake.size - 1; // return score (length of the snake - 1) + // end::solution[] + // tag::description[] + } +} +// end::description[] + +module.exports = { SnakeGame }; diff --git a/book/interview-questions/design-snake-game.spec.js b/book/interview-questions/design-snake-game.spec.js new file mode 100644 index 00000000..acfcbd1f --- /dev/null +++ b/book/interview-questions/design-snake-game.spec.js @@ -0,0 +1,31 @@ +const { SnakeGame } = require('./design-snake-game'); + +describe('Queue: Design Snake Game', () => { + it('should game over when hits wall', () => { + const snakeGame = new SnakeGame(4, 2, [[1, 2], [0, 1]]); + expect(snakeGame.move('R')).toEqual(0); // 0 + expect(snakeGame.move('D')).toEqual(0); // 0 + expect(snakeGame.move('R')).toEqual(1); // 1 (ate food1) + expect(snakeGame.move('U')).toEqual(1); // 1 + expect(snakeGame.move('L')).toEqual(2); // 2 (ate food2) + expect(snakeGame.move('U')).toEqual(-1); // -1 (hit wall) + }); + + it('should circle around without eating itself', () => { + const snakeGame = new SnakeGame(2, 2, [[0, 1], [1, 1], [1, 0]]); + expect(snakeGame.move('R')).toEqual(1); + expect(snakeGame.move('D')).toEqual(2); + expect(snakeGame.move('L')).toEqual(3); + expect(snakeGame.move('U')).toEqual(3); + expect(snakeGame.move('R')).toEqual(3); + }); + + it('should game over when hit itself', () => { + const snakeGame = new SnakeGame(3, 2, [[0, 1], [0, 2], [1, 2], [1, 1]]); + expect(snakeGame.move('R')).toEqual(1); + expect(snakeGame.move('R')).toEqual(2); + expect(snakeGame.move('D')).toEqual(3); + expect(snakeGame.move('L')).toEqual(4); + expect(snakeGame.move('U')).toEqual(-1); + }); +}); From 77d459642ca61f729e698c892928665e76532701 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 29 Aug 2020 17:21:21 -0400 Subject: [PATCH 118/200] feat(book/queue): add recent counter questions and solution --- book/D-interview-questions-solutions.asc | 57 ++++++++--------- book/content/part02/queue.asc | 41 ++++++------ book/interview-questions/recent-counter.js | 64 +++++++++++++++++++ .../recent-counter.spec.js | 21 ++++++ 4 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 book/interview-questions/recent-counter.js create mode 100644 book/interview-questions/recent-counter.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 13a7ee85..dd2d8a54 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -275,65 +275,64 @@ The stack contains the indexes rather than the temperatures themselves. :leveloffset: -1 -[#queue-q-design-snake-game] -include::content/part02/queue.asc[tag=queue-q-design-snake-game] +[#queue-q-recent-counter] +include::content/part02/queue.asc[tag=queue-q-recent-counter] -This game is perfect to practice working with Queues. There are at least two opportunities to use a Queue. One for the food location and another for the snake body part movements. One very move, we insert a new position into the snake and dequeue the last position to indicate the snake moved. Everytime the snake eats food, it grows one more unit, the food gets dequeue and we place the location of next food (if any). +We are ask to keep track of the request only within a given time window. A queue is a perfect application for this. We can add any new request to Queue. Also, we need to check if the oldest element is outside the window. If so we remove it from the queue. *Algorithm*: -- Based on the snake head current position, calculate the next position based on the given move `direction`. -- If the new position is outside the boundaries, game over(return -1) -- If the new position has food, remove that eaten food from its queue and go to the next. -- If the new position doesn't have food, remove the tail of the snake since it moved. -- If the snake new position hits itself, game over (return -1). To make this check we have to options: - - Queue: we can visit all the elements on snake queue (body) and check if new position collide. That's `O(n)` - - Set: we can maintain a `set` that has all the snake locations so the check is `O(1)`. -- Move the snake head to new location (enqueue) -- Return the score (snake's length - 1); +- Enqueue new requests +- Take a `peek` at the oldest request on the queue. +- While current timestamp - oldest timestamp, dequeue the oldest. +- Return the length of the queue. *Implementation*: [source, javascript] ---- -include::interview-questions/design-snake-game.js[tag=description] -include::interview-questions/design-snake-game.js[tag=solution] +include::interview-questions/recent-counter.js[tag=description,solution] ---- -As you can see we opted for using a set to trade speed for memory. +IMPLEMENTATION NOTES *Complexity Analysis*: -- Time: `O(1)`. Insert/Remove from Queue is constant time. Check body collisions is `O(1)` as well when using a set. If you traversed the snake queue, it would be `O(n)`, where `n` is the max length of the snake which is the size of the screen (height x width). -- Space: `O(n + m)`. `m` is the number of food items and `n` is the maximun size of the snake which is (height x width). +- Time: `O(?)`. WHY? +- Space: `O(?)`. WHY? -[#queue-q-FILENAME] -include::content/part02/queue.asc[tag=queue-q-FILENAME] +[#queue-q-design-snake-game] +include::content/part02/queue.asc[tag=queue-q-design-snake-game] -RESTATE REQUIREMENTS AND DESCRIPTIONS +This game is perfect to practice working with Queues. There are at least two opportunities to use a Queue. One for the food location and another for the snake body part movements. One very move, we insert a new position into the snake and dequeue the last position to indicate the snake moved. Everytime the snake eats food, it grows one more unit, the food gets dequeue and we place the location of next food (if any). *Algorithm*: -- STEP 1 -- STEP 2 - - STEP 2.1 - - STEP 2.2 +- Based on the snake head current position, calculate the next position based on the given move `direction`. +- If the new position is outside the boundaries, game over(return -1) +- If the new position has food, remove that eaten food from its queue and go to the next. +- If the new position doesn't have food, remove the tail of the snake since it moved. +- If the snake new position hits itself, game over (return -1). To make this check we have to options: + - Queue: we can visit all the elements on snake queue (body) and check if new position collide. That's `O(n)` + - Set: we can maintain a `set` that has all the snake locations so the check is `O(1)`. +- Move the snake head to new location (enqueue) +- Return the score (snake's length - 1); *Implementation*: [source, javascript] ---- -include::interview-questions/FILENAME.js[tag=description] -include::interview-questions/FILENAME.js[tag=solution] +include::interview-questions/design-snake-game.js[tag=description,solution] ---- -IMPLEMENTATION NOTES +As you can see we opted for using a set to trade speed for memory. *Complexity Analysis*: -- Time: `O(?)`. WHY? -- Space: `O(?)`. WHY? +- Time: `O(1)`. Insert/Remove from Queue is constant time. Check body collisions is `O(1)` as well when using a set. If you traversed the snake queue, it would be `O(n)`, where `n` is the max length of the snake which is the size of the screen (height x width). +- Space: `O(n + m)`. `m` is the number of food items and `n` is the maximun size of the snake which is (height x width). + diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 46793934..3dd78caf 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -83,39 +83,38 @@ As an experiment, we can see in the following table that if we had implemented t indexterm:[Runtime, Linear] -==== Interview Questions +==== Practice Questions (((Interview Questions, Queue))) -// tag::queue-q-design-snake-game[] -===== Design Snake Game -*QU-1*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for game over._ -// end::queue-q-design-snake-game[] +// tag::queue-q-recent-counter[] +===== Recent Counter -_Question seen at: Amazon, Bloomberg, Apple_ +*QU-1*) _Design a class that counts the most recent requests within a time window._ +// end::queue-q-recent-counter[] +_Seen in interviews at: Google, Bloomberg, Yandex_ [source, javascript] ---- -include::../../interview-questions/design-snake-game.js[tag=description] +include::../../interview-questions/recent-counter.js[tag=description] + // write you code here +} ---- -_Solution: <>_ - - +_Solution: <>_ +// tag::queue-q-design-snake-game[] +===== Design Snake Game -// // tag::queue-q-name-2[] -// ===== NAME2 +*QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for game over._ +// end::queue-q-design-snake-game[] -// *QU-2*) _DESCRIPTION_ -// // end::queue-q-name-2[] +_Seen in interviews at: Amazon, Bloomberg, Apple_ -// [source, javascript] -// ---- -// include::../../interview-questions/name-2.js[tag=description] -// // write you code here -// } -// ---- +[source, javascript] +---- +include::../../interview-questions/design-snake-game.js[tag=description] +---- -// _Solution: <>_ +_Solution: <>_ diff --git a/book/interview-questions/recent-counter.js b/book/interview-questions/recent-counter.js new file mode 100644 index 00000000..49c685e9 --- /dev/null +++ b/book/interview-questions/recent-counter.js @@ -0,0 +1,64 @@ +const { Queue } = require('../../src/index'); + +// tag::description[] +/** + * Counts the most recent requests within a time window. + * Each request has its timestamp. + * If the time window is 2 seconds, + * any requests that happened more than 2 seconds before the most recent request + * should not count. + * + * @example - The time window is 10 ms. + * const counter = new RecentCounter(10); + * counter.request(1000); // 1 (first request, it counts) + * counter.request(3000); // 1 (last requests was 2000 ms ago, > 10ms, so doesn't count) + * counter.request(3100); // 1 (last requests was 100 ms ago, > 10ms, so doesn't count) + * counter.request(3105); // 2 (last requests was 5 ms ago, <= 10ms, so it counts) + * + * @example - The time window is 3 sec. (3000 ms) + * const counter = new RecentCounter(3000); + * counter.request(100); // 1 + * counter.request(1000); // 2 + * counter.request(3000); // 3 + * counter.request(3100); // 4 + * counter.request(3101); // 4 (request at time 100 is out of the 3000 window). + * + */ +class RecentCounter { + // end::description[] + // tag::solution[] + queue = new Queue(); + // end::solution[] + // tag::description[] + /** + * @param {number} maxWindow - Max. time window (in ms) for counting requests + * Defaults to 1 second (1000 ms) + */ + constructor(maxWindow = 1000) { + // end::description[] + // tag::solution[] + this.window = maxWindow; + // end::solution[] + // tag::description[] + } + + /** + * Add new request and calculate the current count within the window. + * @param {number} timestamp - The current timestamp (increasing order) + * @return {number} - The number of requests within the time window. + */ + request(timestamp) { + // end::description[] + // tag::solution[] + this.queue.enqueue(timestamp); + while (timestamp - this.queue.peek() > this.window) + this.queue.dequeue(); + + return this.queue.size; + // end::solution[] + // tag::description[] + } +} +// end::description[] + +module.exports = { RecentCounter }; diff --git a/book/interview-questions/recent-counter.spec.js b/book/interview-questions/recent-counter.spec.js new file mode 100644 index 00000000..5ed65746 --- /dev/null +++ b/book/interview-questions/recent-counter.spec.js @@ -0,0 +1,21 @@ +const { RecentCounter } = require('./recent-counter'); + +describe('Queue: Recent Counter', () => { + it('should count requests within the window', () => { + const counter = new RecentCounter(3000); + expect(counter.request(100)).toEqual(1); // 1 + expect(counter.request(1000)).toEqual(2); // 2 + expect(counter.request(3000)).toEqual(3); // 3 + expect(counter.request(3100)).toEqual(4); // 4 + expect(counter.request(3101)).toEqual(4); // 4 (request at time 100 is out of the 3000 window). + }); + + it('should NOT count requests out of the window', () => { + const counter = new RecentCounter(10); + expect(counter.request(100)).toEqual(1); + expect(counter.request(1000)).toEqual(1); + expect(counter.request(3000)).toEqual(1); + expect(counter.request(3100)).toEqual(1); + expect(counter.request(3101)).toEqual(2); + }); +}); From 1f01bafdb55dcd82f6b88bdf1252c5aabb39277a Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 29 Aug 2020 17:39:59 -0400 Subject: [PATCH 119/200] feat(book/questions): add where the interview questions have been seen --- book/D-interview-questions-solutions.asc | 9 +++------ book/content/part02/array.asc | 6 +++++- book/content/part02/linked-list.asc | 6 +++++- book/content/part02/queue.asc | 17 +++++++++++++++-- book/content/part02/stack.asc | 6 +++++- book/interview-questions/recent-counter.js | 9 +-------- 6 files changed, 34 insertions(+), 19 deletions(-) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index dd2d8a54..c0ddb13f 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -90,8 +90,7 @@ Algorithm: [source, javascript] ---- -include::interview-questions/buy-sell-stock.js[tag=description] -include::interview-questions/buy-sell-stock.js[tag=solution] +include::interview-questions/buy-sell-stock.js[tag=description,solution] ---- The runtime is `O(n)` and space complexity of `O(1)`. @@ -126,8 +125,7 @@ Another case to take into consideration is that lists might have different lengt [source, javascript] ---- -include::interview-questions/merge-lists.js[tag=description] -include::interview-questions/merge-lists.js[tag=solution] +include::interview-questions/merge-lists.js[tag=description,solution] ---- Notice that we used a "dummy" node or "sentinel node" to have some starting point for the final list. @@ -172,8 +170,7 @@ A better way to solve this problem is iterating over each character on both list [source, javascript] ---- -include::interview-questions/linkedlist-same-data.js[tag=description] -include::interview-questions/linkedlist-same-data.js[tag=solution] +include::interview-questions/linkedlist-same-data.js[tag=description,solution] ---- The function `findNextPointerIndex` is a helper to navigate each character on a linked list. diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index e03863e5..fbaff07b 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -276,13 +276,15 @@ To sum up, the time complexity of an array is: |=== //end::table -==== Interview Questions +==== Practice Questions (((Interview Questions, Arrays))) // tag::array-q-max-subarray[] ===== Max Subarray *AR-1*) _Given an array of integers, find the maximum sum of consecutive elements (subarray)._ + +_Seen in interviews at: Amazon, Apple, Google, Microsoft, Facebook_ // end::array-q-max-subarray[] [source, javascript] @@ -298,6 +300,8 @@ _Solution: <>_ ===== Best Time to Buy and Sell an Stock *AR-2*) _You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximum profit you can obtain? (Note: you have to buy first and then sell)_ + +_Seen in interviews at: Amazon, Facebook, Bloomberg_ // end::array-q-buy-sell-stock[] [source, javascript] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 71b68c82..329db496 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -286,13 +286,15 @@ Use a doubly linked list when: For the next two linear data structures <> and <>, we are going to use a doubly-linked list to implement them. We could use an array as well, but since inserting/deleting from the start performs better with linked-lists, we will use that. -==== Interview Questions +==== Practice Questions (((Interview Questions, Linked Lists))) // tag::linkedlist-q-merge-lists[] ===== Merge Linked Lists into One *LL-1*) _Merge two sorted lists into one (and keep them sorted)_ + +_Seen in interviews at: Amazon, Adobe, Microsoft, Google_ // end::linkedlist-q-merge-lists[] [source, javascript] @@ -311,6 +313,8 @@ _Solution: <>_ ===== Check if two strings lists are the same *LL-2*) _Given two linked lists with strings, check if are the same_ + +_Seen in interviews at: Facebook_ // end::linkedlist-q-linkedlist-same-data[] [source, javascript] diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 3dd78caf..90e88288 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -91,8 +91,21 @@ indexterm:[Runtime, Linear] ===== Recent Counter *QU-1*) _Design a class that counts the most recent requests within a time window._ -// end::queue-q-recent-counter[] + +Example: + +[source, javascript] +---- +const counter = new RecentCounter(10); // The time window is 10 ms. +counter.request(1000); // 1 (first request, it always counts) +counter.request(3000); // 1 (last requests was 2000 ms ago, > 10ms, so doesn't count) +counter.request(3100); // 1 (last requests was 100 ms ago, > 10ms, so doesn't count) +counter.request(3105); // 2 (last requests was 5 ms ago, <= 10ms, so it counts) +---- + _Seen in interviews at: Google, Bloomberg, Yandex_ +// end::queue-q-recent-counter[] + [source, javascript] ---- @@ -108,9 +121,9 @@ _Solution: <>_ ===== Design Snake Game *QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for game over._ -// end::queue-q-design-snake-game[] _Seen in interviews at: Amazon, Bloomberg, Apple_ +// end::queue-q-design-snake-game[] [source, javascript] ---- diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index ae00254b..f0a1a381 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -87,13 +87,15 @@ Implementing the stack with an array and linked list would lead to the same time It's not very common to search for values on a stack (other Data Structures are better suited for this). Stacks are especially useful for implementing <>. -==== Interview Questions +==== Practice Questions (((Interview Questions, Stack))) // tag::stack-q-valid-parentheses[] ===== Validate Parentheses / Braces / Brackets *ST-1*) _Given an string with 3 types of brakets: `()`, `{}`, and `[]`. Validate they are properly closed and opened._ + +_Seen in interviews at: Amazon, Bloomberg, Facebook, Citadel_ // end::stack-q-valid-parentheses[] [source, javascript] @@ -113,6 +115,8 @@ _Solution: <>_ ===== Daily Temperaturs *ST-2*) _Given an array of integers from 30 to 100 (daily temperatures), return another array that for each day in the input, tells you how many days you would have to wait until a warmer temperature. If no warmer temperature is possible then return `0` for that element._ + +_Seen in interviews at: Amazon, Adobe, Cisco_ // end::stack-q-daily-temperatures[] [source, javascript] diff --git a/book/interview-questions/recent-counter.js b/book/interview-questions/recent-counter.js index 49c685e9..052e27f6 100644 --- a/book/interview-questions/recent-counter.js +++ b/book/interview-questions/recent-counter.js @@ -8,20 +8,13 @@ const { Queue } = require('../../src/index'); * any requests that happened more than 2 seconds before the most recent request * should not count. * - * @example - The time window is 10 ms. - * const counter = new RecentCounter(10); - * counter.request(1000); // 1 (first request, it counts) - * counter.request(3000); // 1 (last requests was 2000 ms ago, > 10ms, so doesn't count) - * counter.request(3100); // 1 (last requests was 100 ms ago, > 10ms, so doesn't count) - * counter.request(3105); // 2 (last requests was 5 ms ago, <= 10ms, so it counts) - * * @example - The time window is 3 sec. (3000 ms) * const counter = new RecentCounter(3000); * counter.request(100); // 1 * counter.request(1000); // 2 * counter.request(3000); // 3 * counter.request(3100); // 4 - * counter.request(3101); // 4 (request at time 100 is out of the 3000 window). + * counter.request(3101); // 4 * */ class RecentCounter { From 29b8dc8535ec4a582b6c6247d0d19f560a65cf57 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 31 Aug 2020 18:39:26 -0400 Subject: [PATCH 120/200] chore(book): improve grammar --- book/D-interview-questions-solutions.asc | 47 ++++++++++++------------ book/config | 2 +- book/content/part02/queue.asc | 10 ++--- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index c0ddb13f..e093ab4c 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -47,7 +47,7 @@ include::interview-questions/max-subarray.js[tag=description] include::interview-questions/max-subarray.js[tag=solution] ---- -The runtime is `O(n)` and space complexity of `O(1)`. +The runtime is `O(n)` and the space complexity of `O(1)`. @@ -93,7 +93,7 @@ Algorithm: include::interview-questions/buy-sell-stock.js[tag=description,solution] ---- -The runtime is `O(n)` and space complexity of `O(1)`. +The runtime is `O(n)` and the space complexity of `O(1)`. @@ -157,7 +157,7 @@ include::interview-questions/linkedlist-same-data.js[tag=hasSameDataBrute1] Notice that the problem mentions that lists could be huge (millions of nodes). If the first character on each list is different, we are unnecessarily computing millions of nodes, when a straightforward check will do the job. -A better way to solve this problem is iterating over each character on both lists, and when we found mistmatch, we return `false` immediately. If they are the same, we still have to visit all of them. +A better way to solve this problem is iterating over each character on both lists, and when we found a mismatch, we return `false` immediately. If they are the same, we still have to visit all of them. *Algorithm*: @@ -174,7 +174,7 @@ include::interview-questions/linkedlist-same-data.js[tag=description,solution] ---- The function `findNextPointerIndex` is a helper to navigate each character on a linked list. -Notice, that we increase the index (`i + 1`) on each iteration. +Notice that we increase the index (`i + 1`) on each iteration. If the index overflows, it moves to the next node and reset the index to zero. @@ -204,7 +204,7 @@ This is a parsing problem, and usually, stacks are good candidates for them. *Algorithm*: -- Create a mapping for each opening bracket, to its closing counterpart. +- Create a mapping for each opening bracket to its closing counterpart. - Iterate through the string - When we found an opening bracket, insert the corresponding closing bracket into the stack. - When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. @@ -275,13 +275,13 @@ The stack contains the indexes rather than the temperatures themselves. [#queue-q-recent-counter] include::content/part02/queue.asc[tag=queue-q-recent-counter] -We are ask to keep track of the request only within a given time window. A queue is a perfect application for this. We can add any new request to Queue. Also, we need to check if the oldest element is outside the window. If so we remove it from the queue. +We are asked to keep track of the request's count only within a given time window. A queue is a perfect application for this. We can add any new request to the Queue. Also, we need to check if the oldest element is outside the time window. If so, we remove it from the queue. *Algorithm*: -- Enqueue new requests -- Take a `peek` at the oldest request on the queue. -- While current timestamp - oldest timestamp, dequeue the oldest. +- Enqueue new requests. +- Take a `peek` at the oldest request in the queue. +- While `current timestamp - oldest timestamp`, dequeue the oldest. - Return the length of the queue. *Implementation*: @@ -291,29 +291,29 @@ We are ask to keep track of the request only within a given time window. A queue include::interview-questions/recent-counter.js[tag=description,solution] ---- -IMPLEMENTATION NOTES +Notice that we enqueue every request, and then we check all the ones that have "expire" and remove them from the queue. *Complexity Analysis*: -- Time: `O(?)`. WHY? -- Space: `O(?)`. WHY? +- Time: `O(n)`, where `n` is the number of requests. One Enqueue/Dequeue operation is O(1). However, we might run into a worst-case where all requests have to be dequeued. +- Space: `O(W)`, where `W` is the time window. We can have at most W requests in the queue since they are in increasing order without duplicates. [#queue-q-design-snake-game] include::content/part02/queue.asc[tag=queue-q-design-snake-game] -This game is perfect to practice working with Queues. There are at least two opportunities to use a Queue. One for the food location and another for the snake body part movements. One very move, we insert a new position into the snake and dequeue the last position to indicate the snake moved. Everytime the snake eats food, it grows one more unit, the food gets dequeue and we place the location of next food (if any). +This game is perfect to practice working with Queues. There are at least two opportunities to use a Queue. You can enqueue the food location, and also you can keep the snake's body parts on a Queue. We insert a new position into the snake's queue on every move and dequeue the last location to indicate the snake moved. Every time the snake eats food, it grows one more unit. The food gets dequeue, and we place the next food location (if any). *Algorithm*: -- Based on the snake head current position, calculate the next position based on the given move `direction`. -- If the new position is outside the boundaries, game over(return -1) -- If the new position has food, remove that eaten food from its queue and go to the next. +- Based on the snake's head current position, calculate the next location based on the given move `direction`. +- If the new position is outside the boundaries, it's game over (return -1). +- If the new location has food, remove that eaten food from its queue and place the next food on the map (if any). - If the new position doesn't have food, remove the tail of the snake since it moved. -- If the snake new position hits itself, game over (return -1). To make this check we have to options: - - Queue: we can visit all the elements on snake queue (body) and check if new position collide. That's `O(n)` - - Set: we can maintain a `set` that has all the snake locations so the check is `O(1)`. -- Move the snake head to new location (enqueue) +- If the snake new position hits itself, game over (return -1). To make this check, we have 2 options: + - Queue: we can visit all the elements on the snake's queue (body) and check if a new position collides. That's `O(n)` + - Set: we can maintain a `set` with all the snake locations, so the check is `O(1)`. +- Move the snake's head to a new location (enqueue) - Return the score (snake's length - 1); *Implementation*: @@ -323,12 +323,12 @@ This game is perfect to practice working with Queues. There are at least two opp include::interview-questions/design-snake-game.js[tag=description,solution] ---- -As you can see we opted for using a set to trade speed for memory. +As you can see, we opted for using a set to trade speed for memory. *Complexity Analysis*: -- Time: `O(1)`. Insert/Remove from Queue is constant time. Check body collisions is `O(1)` as well when using a set. If you traversed the snake queue, it would be `O(n)`, where `n` is the max length of the snake which is the size of the screen (height x width). -- Space: `O(n + m)`. `m` is the number of food items and `n` is the maximun size of the snake which is (height x width). +- Time: `O(1)`. Insert/Remove from Queue is constant time. Check for body collisions is `O(1)` when using a set. If instead of a set, you traversed the snake's queue to find a collision, it would be `O(n)`. Here`n` is the snake's max length, which is the size of the screen (height x width). +- Space: `O(n + m)`. `m` is the number of food items, and `n` is the snake's maximum size (height x width). @@ -359,4 +359,3 @@ As you can see we opted for using a set to trade speed for memory. // - Time: `O(?)`. WHY? // - Space: `O(?)`. WHY? - diff --git a/book/config b/book/config index b4dd20d3..d3399d43 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit b4dd20d3f92beb4dd48445464e1734819a9cd40a +Subproject commit d3399d43719dce212a8e3842465d07ed5c561542 diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 90e88288..36dabaf0 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -14,11 +14,11 @@ A queue is a linear data structure where the data flows in a *First-In-First-Out .Queue data structure is like a line of people: the First-in, is the First-out image::image30.png[image,width=528,height=171] -A queue is like a line of people at the bank; the person that arrived first is the first to go out as well. +A queue is like a line of people at the bank; the person who arrived first is the first to go out. Similar to the stack, we only have two operations (insert and remove). In a Queue, we add elements to the back of the list and remove it from the front. -We could use an array or a linked list to implement a Queue. However, it is recommended only to use a linked list. Why? An array has a linear runtime _O(n)_ to remove an element from the start while a linked list has constant time _O(1)_. +We could use an array or a linked list to implement a Queue. However, it is recommended only to use a linked list. Why? An array has a linear runtime _O(n)_ to remove an element from the start, while a linked list has constant time _O(1)_. .Queue's constructor [source, javascript] @@ -56,7 +56,7 @@ As discussed, this operation has a constant runtime. ==== Implementation usage -We can use our Queue class like follows: +We can use our Queue class as follows: .Queue usage example [source, javascript] @@ -64,7 +64,7 @@ We can use our Queue class like follows: include::{codedir}/data-structures/queues/queue.js[tag=snippet, indent=0] ---- -You can see that the items are dequeued in the same order they were added, FIFO (first-in, first out). +You can see that the items are dequeued in the same order they were added, FIFO (first-in, first-out). ==== Queue Complexity @@ -120,7 +120,7 @@ _Solution: <>_ // tag::queue-q-design-snake-game[] ===== Design Snake Game -*QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for game over._ +*QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for a game over._ _Seen in interviews at: Amazon, Bloomberg, Apple_ // end::queue-q-design-snake-game[] From c1a8f8ec53f6c4c1302001dba6d913c81156fd98 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 31 Aug 2020 19:47:31 -0400 Subject: [PATCH 121/200] feat(book/questions): add examples --- book/content/part02/array.asc | 19 +++++++++++++++++++ book/content/part02/linked-list.asc | 17 ++++++++++++++++- book/content/part02/queue.asc | 15 ++++++++++++++- book/content/part02/stack.asc | 19 +++++++++++++++++++ .../interview-questions/daily-temperatures.js | 4 ++-- book/interview-questions/design-snake-game.js | 6 +++--- book/interview-questions/max-subarray.js | 5 +++-- book/interview-questions/max-subarray.spec.js | 4 ++++ 8 files changed, 80 insertions(+), 9 deletions(-) diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index fbaff07b..cec213fc 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -284,6 +284,15 @@ To sum up, the time complexity of an array is: *AR-1*) _Given an array of integers, find the maximum sum of consecutive elements (subarray)._ +Examples: + +[source, javascript] +---- +maxSubArray([1, -3, 10, -5]); // 10 (taking only 10) +maxSubArray([-3, 4,-1, 2, 1, -5]); // 6 (sum [4,-1, 2, 1]) +maxSubArray([-2, 1, -3, 4, -1, 3, 1]); // 7 (sum [4,-1, 3, 1]) +---- + _Seen in interviews at: Amazon, Apple, Google, Microsoft, Facebook_ // end::array-q-max-subarray[] @@ -301,6 +310,16 @@ _Solution: <>_ *AR-2*) _You are given an array of integers. Each value represents the closing value of the stock on that day. You are only given one chance to buy and then sell. What's the maximum profit you can obtain? (Note: you have to buy first and then sell)_ +Examples: + +[source, javascript] +---- +maxProfit([1, 2, 3]) // 2 (buying at 1 and selling at 3) +maxProfit([3, 2, 1]) // 2 (no buys) +maxProfit([5, 10, 5, 10]) // 5 (buying at 5 and selling at 10) + +---- + _Seen in interviews at: Amazon, Facebook, Bloomberg_ // end::array-q-buy-sell-stock[] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 329db496..409bab6e 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -294,6 +294,13 @@ For the next two linear data structures <> *LL-1*) _Merge two sorted lists into one (and keep them sorted)_ +Examples: + +---- +mergeTwoLists(2->3->4, 1->2); // 1->2->2->3->4 +mergeTwoLists(2->3->4,null); // 2->3->4 +---- + _Seen in interviews at: Amazon, Adobe, Microsoft, Google_ // end::linkedlist-q-merge-lists[] @@ -312,7 +319,15 @@ _Solution: <>_ // tag::linkedlist-q-linkedlist-same-data[] ===== Check if two strings lists are the same -*LL-2*) _Given two linked lists with strings, check if are the same_ +*LL-2*) _Given two linked lists with strings, check if the data is equivalent._ + +Examples: + +---- +hasSameData(he->ll->o, hel->lo); // true +hasSameData(hello, hel->lo); // true +hasSameData(he->ll->o, h->i); // false +---- _Seen in interviews at: Facebook_ // end::linkedlist-q-linkedlist-same-data[] diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 36dabaf0..9930b9f1 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -120,7 +120,20 @@ _Solution: <>_ // tag::queue-q-design-snake-game[] ===== Design Snake Game -*QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself return `-1` for a game over._ +*QU-2*) _Design the `move` function for the snake game. The move function returns an integer representing the current score. If the snake goes out of the given height and width or hit itself the game is over and return `-1`._ + +Example: + +[source, javascript] +---- +const snakeGame = new SnakeGame(4, 2, [[1, 2], [0, 1]]); +expect(snakeGame.move('R')).toEqual(0); // 0 +expect(snakeGame.move('D')).toEqual(0); // 0 +expect(snakeGame.move('R')).toEqual(1); // 1 (ate food1) +expect(snakeGame.move('U')).toEqual(1); // 1 +expect(snakeGame.move('L')).toEqual(2); // 2 (ate food2) +expect(snakeGame.move('U')).toEqual(-1); // -1 (hit wall) +---- _Seen in interviews at: Amazon, Bloomberg, Apple_ // end::queue-q-design-snake-game[] diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index f0a1a381..b46b5e3b 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -95,6 +95,17 @@ It's not very common to search for values on a stack (other Data Structures are *ST-1*) _Given an string with 3 types of brakets: `()`, `{}`, and `[]`. Validate they are properly closed and opened._ +Examples: + +[source, javascript] +---- +isParenthesesValid('(){}[]'); // true +isParenthesesValid('('); // false (closing parentheses is missing) +isParenthesesValid('([{}])'); // true +isParenthesesValid('[{]}'); // false (brakets are not closed in the right order) +isParenthesesValid('([{)}]'); // false (closing is out of order) +---- + _Seen in interviews at: Amazon, Bloomberg, Facebook, Citadel_ // end::stack-q-valid-parentheses[] @@ -116,6 +127,14 @@ _Solution: <>_ *ST-2*) _Given an array of integers from 30 to 100 (daily temperatures), return another array that for each day in the input, tells you how many days you would have to wait until a warmer temperature. If no warmer temperature is possible then return `0` for that element._ +Examples: + +[source, javascript] +---- +dailyTemperatures([30, 28, 50, 40, 30]); // [2 (to 50), 1 (to 28), 0, 0, 0] +dailyTemperatures([73, 69, 72, 76, 73, 100]); // [3, 1, 1, 0, 1, 100] +---- + _Seen in interviews at: Amazon, Adobe, Cisco_ // end::stack-q-daily-temperatures[] diff --git a/book/interview-questions/daily-temperatures.js b/book/interview-questions/daily-temperatures.js index 5a4b4613..c46cf702 100644 --- a/book/interview-questions/daily-temperatures.js +++ b/book/interview-questions/daily-temperatures.js @@ -5,8 +5,8 @@ * for each elem from the input. * * @examples - * dailyTemperatures([30, 28, 50, 40, 30]); // [2, 1, 0, 0, 0] - * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] + * dailyTemperatures([30, 28, 50, 40, 30]); // [2, 1, 0, 0, 0] + * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] * * @param {number[]} t - Daily temperatures */ diff --git a/book/interview-questions/design-snake-game.js b/book/interview-questions/design-snake-game.js index 6d9d7cf3..9a327e4f 100644 --- a/book/interview-questions/design-snake-game.js +++ b/book/interview-questions/design-snake-game.js @@ -14,9 +14,9 @@ const { Queue } = require('../../src/index'); * snakeGame.move('R'); // 0 * snakeGame.move('D'); // 0 * snakeGame.move('R'); // 0 - * snakeGame.move('U'); // 1 (ate the food1) - * snakeGame.move('L'); // 2 (ate the food2) - * snakeGame.move('U'); // -1 (hit the upper wall) + * snakeGame.move('U'); // 1 + * snakeGame.move('L'); // 2 + * snakeGame.move('U'); // -1 */ class SnakeGame { // end::description[] diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js index 0245702f..a1217635 100644 --- a/book/interview-questions/max-subarray.js +++ b/book/interview-questions/max-subarray.js @@ -1,9 +1,10 @@ // tag::description[] /** * Find the maximun sum of contiguous elements in an array. + * * @examples - * maxSubArray([1, -3, 10, -5]); // => 10 - * maxSubArray([-3,4,-1,2,1,-5]); // => 6 + * maxSubArray([1, -3, 10, -5]); // => 10 + * maxSubArray([-3,4,-1,2,1,-5]); // => 6 * * @param {number[]} a - Array */ diff --git a/book/interview-questions/max-subarray.spec.js b/book/interview-questions/max-subarray.spec.js index e8a43048..2d6a8e23 100644 --- a/book/interview-questions/max-subarray.spec.js +++ b/book/interview-questions/max-subarray.spec.js @@ -8,6 +8,10 @@ describe('Max Subarray Sum', () => { expect(fn([-2, 1, -3, 4, -1, 2, 1, -5, 4])).toEqual(6); }); + it('should work with small arrays', () => { + expect(fn([1, -3, 10, -5])).toEqual(10); + }); + it('should work with large arrays', () => { expect(fn(largeArray)).toEqual(4853); }); From e2f4af01eb307232d508fd10f425ae7338bd8294 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 31 Aug 2020 23:53:33 +0000 Subject: [PATCH 122/200] :bookmark: chore(release): 1.14.0 # [1.14.0](https://github.com/amejiarosario/dsa.js/compare/1.13.0...1.14.0) (2020-08-31) ### Features * **book/questions:** add examples ([c1a8f8e](https://github.com/amejiarosario/dsa.js/commit/c1a8f8ec53f6c4c1302001dba6d913c81156fd98)) * **book/questions:** add where the interview questions have been seen ([1f01baf](https://github.com/amejiarosario/dsa.js/commit/1f01bafdb55dcd82f6b88bdf1252c5aabb39277a)) * **book/queue:** add recent counter questions and solution ([77d4596](https://github.com/amejiarosario/dsa.js/commit/77d459642ca61f729e698c892928665e76532701)) * **book/queue:** add solution for queue question ([9a88766](https://github.com/amejiarosario/dsa.js/commit/9a887660bd21e7dbda0d3e87af704b4e41874093)) * **queue:** add front, back and peek methods ([04aa9db](https://github.com/amejiarosario/dsa.js/commit/04aa9db26659058c09debe985f94845933a2089d)) --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee461a8c..66d2c6a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# [1.14.0](https://github.com/amejiarosario/dsa.js/compare/1.13.0...1.14.0) (2020-08-31) + + +### Features + +* **book/questions:** add examples ([c1a8f8e](https://github.com/amejiarosario/dsa.js/commit/c1a8f8ec53f6c4c1302001dba6d913c81156fd98)) +* **book/questions:** add where the interview questions have been seen ([1f01baf](https://github.com/amejiarosario/dsa.js/commit/1f01bafdb55dcd82f6b88bdf1252c5aabb39277a)) +* **book/queue:** add recent counter questions and solution ([77d4596](https://github.com/amejiarosario/dsa.js/commit/77d459642ca61f729e698c892928665e76532701)) +* **book/queue:** add solution for queue question ([9a88766](https://github.com/amejiarosario/dsa.js/commit/9a887660bd21e7dbda0d3e87af704b4e41874093)) +* **queue:** add front, back and peek methods ([04aa9db](https://github.com/amejiarosario/dsa.js/commit/04aa9db26659058c09debe985f94845933a2089d)) + # [1.13.0](https://github.com/amejiarosario/dsa.js/compare/1.12.0...1.13.0) (2020-08-26) diff --git a/package-lock.json b/package-lock.json index 66f93610..ad15ca99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.13.0", + "version": "1.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5e0b002b..2c7642ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.13.0", + "version": "1.14.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 464417e37ccde00d56d8ebb9c0d0ddc9e510e368 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 1 Sep 2020 15:30:33 -0400 Subject: [PATCH 123/200] fix(book/solutions): fix missing solutions --- book/D-interview-questions-solutions.asc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index e093ab4c..e0070e76 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -90,7 +90,7 @@ Algorithm: [source, javascript] ---- -include::interview-questions/buy-sell-stock.js[tag=description,solution] +include::interview-questions/buy-sell-stock.js[tags=description;solution] ---- The runtime is `O(n)` and the space complexity of `O(1)`. @@ -125,7 +125,7 @@ Another case to take into consideration is that lists might have different lengt [source, javascript] ---- -include::interview-questions/merge-lists.js[tag=description,solution] +include::interview-questions/merge-lists.js[tags=description;solution] ---- Notice that we used a "dummy" node or "sentinel node" to have some starting point for the final list. @@ -170,7 +170,7 @@ A better way to solve this problem is iterating over each character on both list [source, javascript] ---- -include::interview-questions/linkedlist-same-data.js[tag=description,solution] +include::interview-questions/linkedlist-same-data.js[tags=description;solution] ---- The function `findNextPointerIndex` is a helper to navigate each character on a linked list. @@ -288,7 +288,7 @@ We are asked to keep track of the request's count only within a given time windo [source, javascript] ---- -include::interview-questions/recent-counter.js[tag=description,solution] +include::interview-questions/recent-counter.js[tags=description;solution] ---- Notice that we enqueue every request, and then we check all the ones that have "expire" and remove them from the queue. @@ -320,7 +320,7 @@ This game is perfect to practice working with Queues. There are at least two opp [source, javascript] ---- -include::interview-questions/design-snake-game.js[tag=description,solution] +include::interview-questions/design-snake-game.js[tags=description;solution] ---- As you can see, we opted for using a set to trade speed for memory. From 068dd9cc66e5a3050cc44d4cd3a05eb15f8c00d1 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 1 Sep 2020 16:44:28 -0400 Subject: [PATCH 124/200] feat(book/bt): add binary tree diameter problem --- book/D-interview-questions-solutions.asc | 78 +++++++++++++ book/config | 2 +- book/content/part03/tree-intro.asc | 103 ++++++++++++++++++ book/images/tree-diameter-example-1.png | Bin 0 -> 10970 bytes book/images/tree-diameter-example-2.png | Bin 0 -> 22793 bytes .../diameter-of-binary-tree.js | 31 ++++++ .../diameter-of-binary-tree.spec.js | 21 ++++ 7 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 book/images/tree-diameter-example-1.png create mode 100644 book/images/tree-diameter-example-2.png create mode 100644 book/interview-questions/diameter-of-binary-tree.js create mode 100644 book/interview-questions/diameter-of-binary-tree.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index e0070e76..2ddd4549 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -332,6 +332,84 @@ As you can see, we opted for using a set to trade speed for memory. +:leveloffset: +1 + +=== Solutions for Binary Tree Questions +(((Interview Questions Solutions, Binary Tree))) + +:leveloffset: -1 + +[#binary-tree-q-diameter-of-binary-tree] +include::content/part03/tree-intro.asc[tag=binary-tree-q-diameter-of-binary-tree] + +We are asked to find the longest path on binary tree that might or might not pass through the root node. + +We can calculate the height (distance from root to farthest leaf) of a binary tree using this recursive function: + +[source, javascript] +---- +function getHeight(node) { + if (!node) return 0; + const leftHeight = getHeight(node.left); + const rightHeight = getHeight(node.right); + return 1 + Math.max(leftHeight, rightHeight); +} +---- + +That will give use the height from furthest leaf to root. However, the problem says that it might or might not go through the root. +In that case, we can keep track of the maximun distance (`leftHeight + rightHeight`) seen so far. + +*Algorithm*: + +- Initialize diameter to `0` +- Recursively find the height of the tree from root. +- Keep track of the maximun diameter length seen so far (left + right). +- Return the diameter. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/diameter-of-binary-tree.js[tags=description;solution] +---- + +We are using `Math.max` to keep track of the longest diameter seen. + +*Complexity Analysis*: + +- Time: `O(n)`, where `n` is each one of the nodes on the tree. We visite each one once. +- Space: `O(n)`. We use `O(1)` variables, but because we are using the `height` recursive function we are using the implicit call stack, thus `O(n)`. + + + + +[#binary-tree-q-diameter-of-binary-tree2] +include::content/part03/tree-intro.asc[tag=binary-tree-q-diameter-of-binary-tree] + +RESTATE REQUIREMENTS AND DESCRIPTIONS + +*Algorithm*: + +- STEP 1 +- STEP 2 + - STEP 2.1 + - STEP 2.2 + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/diameter-of-binary-tree.js[tag=description] +include::interview-questions/diameter-of-binary-tree.js[tag=solution] +---- + +IMPLEMENTATION NOTES + +*Complexity Analysis*: + +- Time: `O(?)`. WHY? +- Space: `O(?)`. WHY? + // [#linkedlist-q-FILENAME] // include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] diff --git a/book/config b/book/config index d3399d43..2134d494 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit d3399d43719dce212a8e3842465d07ed5c561542 +Subproject commit 2134d494d3c1834f04871f315983a3c5ee571e82 diff --git a/book/content/part03/tree-intro.asc b/book/content/part03/tree-intro.asc index f95fb889..e361ee5e 100644 --- a/book/content/part03/tree-intro.asc +++ b/book/content/part03/tree-intro.asc @@ -109,3 +109,106 @@ image::image35.png[image,width=258,height=169] Heap is better at finding max or min values in constant time *O(1)*, while a balanced BST is good a finding any element in *O(log n)*. Heaps are often used to implement priority queues while BST is used when you need every value sorted. **** indexterm:[Runtime, Logarithmic] + + +==== Practice Questions +(((Interview Questions, Binary Tree))) + + +// tag::binary-tree-q-diameter-of-binary-tree[] +===== Binary Tree Diameter + +*BT-1*) _Find the diameter of a binary tree. The diameter of a tree is defined as the longest possible path from two nodes (it doesn't need to include the root). The lenth of diameter is calculated by couting the number of edges on the path._ + +// end::binary-tree-q-diameter-of-binary-tree[] + +_Seen in interviews at: Facebook, Amazon, Google_ + +Example 1: + +[graphviz, tree-diameter-example-1, png] +.... +graph G { + 1 -- 2 [color=red] + 1 -- 3 [color=red] + + 2 -- 4 + 2 -- 5 [color=red] +} +.... + +[source, javascript] +---- +diameterOfBinaryTree(toBinaryTree([1,2,3,4,5])); // 3 (the path 3-1-2-5 or 3-1-2-4) +---- + +Example 2: + +[graphviz, tree-diameter-example-2, png] +.... +graph G { + 1 + 2 + 3 + 4 + 5 + 6 + "null" [color=white, fontcolor = white] + "null." [color=white, fontcolor = white] + 7 + 8 + "null.." [color=white, fontcolor = white] + "null..." [color=white, fontcolor = white] + 9 + + 1 -- 2 + 1 -- 3 + + 3 -- 4 [color=red] + 3 -- 5 [color=red] + + 4 -- 6 [color=red] + 4 -- "null." [color=white] + + 5 -- "null" [color=white] + 5 -- 7 [color=red] + + 6 -- 8 [color=red] + 6 -- "null.." [color=white] + + 7 -- "null..." [color=white] + 7 -- 9 [color=red] +} +.... + +[source, javascript] +---- +diameterOfBinaryTree(toBinaryTree([1,2,3,null,null,4,5,6,null,null,7,8,null,null,9])); // 6 (the path 8-6-4-3-5-7-9) +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/diameter-of-binary-tree.js[tags=description;placeholder] +---- + + +_Solution: <>_ + + + +// tag::binary-tree-q-FILENAME[] +===== Recent Counter + +*BT-2*) _._ + +Example: + +[source, javascript] +---- + +---- + +_Seen in interviews at: X_ +// end::binary-tree-q-FILENAME[] diff --git a/book/images/tree-diameter-example-1.png b/book/images/tree-diameter-example-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9043ce9c08a40e5fe3f8a1b82dbd4526d7a285 GIT binary patch literal 10970 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 literal 0 HcmV?d00001 diff --git a/book/images/tree-diameter-example-2.png b/book/images/tree-diameter-example-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3c78583dcf442f0ff82cabdae35f6ee8719f1dc7 GIT binary patch literal 22793 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 { + if (!node) return 0; + const left = height(node.left); + const right = height(node.right); + diameter = Math.max(diameter, left + right); + return 1 + Math.max(left, right); + }; + + height(root); + return diameter; + // end::solution[] + // tag::description[] +} +// end::description[] + +module.exports = { diameterOfBinaryTree }; diff --git a/book/interview-questions/diameter-of-binary-tree.spec.js b/book/interview-questions/diameter-of-binary-tree.spec.js new file mode 100644 index 00000000..2d19358f --- /dev/null +++ b/book/interview-questions/diameter-of-binary-tree.spec.js @@ -0,0 +1,21 @@ +const { diameterOfBinaryTree } = require('./diameter-of-binary-tree'); +const { BinaryTreeNode } = require('../../src/index'); + +describe('Binary Tree: Diameter', () => { + function toBinaryTree(array, index = 0) { + if (index >= array.length) return null; + const node = new BinaryTreeNode(array[index]); + node.left = toBinaryTree(array, index * 2 + 1); + node.right = toBinaryTree(array, index * 2 + 2); + return node; + } + + it('should find the diameter', () => { + expect(diameterOfBinaryTree(toBinaryTree([1, 2, 3, 4, 5]))).toEqual(3); + }); + + it('should find the diameter when does not pass through the root node', () => { + const tree = [1, 2, 3, null, null, 4, 5, 6, null, null, 7, 8, null, null, 9]; + expect(diameterOfBinaryTree(toBinaryTree(tree))).toEqual(6); + }); +}); From 28346a448e7f1be640751098b4a954ac04dd0aad Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 2 Sep 2020 12:01:37 -0400 Subject: [PATCH 125/200] feat(book/binary-tree): add right side view exercise and solution --- book/D-interview-questions-solutions.asc | 57 +++--- book/content/part02/array.asc | 4 +- book/content/part02/linked-list.asc | 4 +- book/content/part02/queue.asc | 4 +- book/content/part02/stack.asc | 4 +- book/content/part03/tree-intro.asc | 176 +++++++++++------- .../binary-tree-right-side-view.js | 59 ++++++ .../binary-tree-right-side-view.spec.js | 24 +++ .../diameter-of-binary-tree.spec.js | 15 +- 9 files changed, 236 insertions(+), 111 deletions(-) create mode 100644 book/interview-questions/binary-tree-right-side-view.js create mode 100644 book/interview-questions/binary-tree-right-side-view.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 2ddd4549..ec1a86e0 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -275,7 +275,7 @@ The stack contains the indexes rather than the temperatures themselves. [#queue-q-recent-counter] include::content/part02/queue.asc[tag=queue-q-recent-counter] -We are asked to keep track of the request's count only within a given time window. A queue is a perfect application for this. We can add any new request to the Queue. Also, we need to check if the oldest element is outside the time window. If so, we remove it from the queue. +We are asked to keep track of the request's count only within a given time window. A queue is a perfect application for this. We can add any new request to the Queue. Also, we need to check if the oldest element is outside the time window. If so, we remove it from the queue. *Algorithm*: @@ -327,7 +327,7 @@ As you can see, we opted for using a set to trade speed for memory. *Complexity Analysis*: -- Time: `O(1)`. Insert/Remove from Queue is constant time. Check for body collisions is `O(1)` when using a set. If instead of a set, you traversed the snake's queue to find a collision, it would be `O(n)`. Here`n` is the snake's max length, which is the size of the screen (height x width). +- Time: `O(1)`. Insert/Remove from Queue is constant time. Check for body collisions is `O(1)` when using a set. If instead of a set, you traversed the snake's queue to find a collision, it would be `O(n)`. Here`n` is the snake's max length, which is the screen size (height x width). - Space: `O(n + m)`. `m` is the number of food items, and `n` is the snake's maximum size (height x width). @@ -342,7 +342,7 @@ As you can see, we opted for using a set to trade speed for memory. [#binary-tree-q-diameter-of-binary-tree] include::content/part03/tree-intro.asc[tag=binary-tree-q-diameter-of-binary-tree] -We are asked to find the longest path on binary tree that might or might not pass through the root node. +We are asked to find the longest path on a binary tree that might or might not pass through the root node. We can calculate the height (distance from root to farthest leaf) of a binary tree using this recursive function: @@ -356,14 +356,14 @@ function getHeight(node) { } ---- -That will give use the height from furthest leaf to root. However, the problem says that it might or might not go through the root. -In that case, we can keep track of the maximun distance (`leftHeight + rightHeight`) seen so far. +That function will give us the height from the furthest leaf to the root. However, the problem says that it might or might not go through the root. +In that case, we can keep track of the maximum distance (`leftHeight + rightHeight`) seen so far. *Algorithm*: - Initialize diameter to `0` -- Recursively find the height of the tree from root. -- Keep track of the maximun diameter length seen so far (left + right). +- Recursively find the height of the tree from the root. +- Keep track of the maximum diameter length seen so far (left + right). - Return the diameter. *Implementation*: @@ -377,38 +377,53 @@ We are using `Math.max` to keep track of the longest diameter seen. *Complexity Analysis*: -- Time: `O(n)`, where `n` is each one of the nodes on the tree. We visite each one once. -- Space: `O(n)`. We use `O(1)` variables, but because we are using the `height` recursive function we are using the implicit call stack, thus `O(n)`. +- Time: `O(n)`, where `n` is each of the tree nodes. We visite each one once. +- Space: `O(n)`. We use `O(1)` variables, but because we are using the `height` recursive function, we use the implicit call stack, thus `O(n)`. -[#binary-tree-q-diameter-of-binary-tree2] -include::content/part03/tree-intro.asc[tag=binary-tree-q-diameter-of-binary-tree] +[#binary-tree-q-binary-tree-right-side-view] +include::content/part03/tree-intro.asc[tag=binary-tree-q-binary-tree-right-side-view] + +The first thing that might come to mind when you have to visit a tree, level by level, is BFS. +We can visit the tree using a Queue and keep track when a level ends, and the new one starts. -RESTATE REQUIREMENTS AND DESCRIPTIONS +Since during BFS, we dequeue one node and enqueue their two children (left and right), we might have two levels (current and next one). For this problem, we need to know what the last node on the current level is. + +.There are several ways to solve this problem using BFS. Here are some ideas: +- *1 Queue + Sentinel node*: we can use a special character in the `Queue` like `'*'` or `null` to indicate the level's change. So, we would start something like this `const queue = new Queue([root, '*']);`. +- *2 Queues*: using a "special" character might be seen as hacky, so you can also opt to keep two queues: one for the current level and another for the next level. +- *1 Queue + size tracking*: we track the Queue's `size` before the children are enqueued. That way, we know where the current level ends. We are going to implement this one. *Algorithm*: -- STEP 1 -- STEP 2 - - STEP 2.1 - - STEP 2.2 +- Enqueue root +- While the queue has an element + - Check the current size of the queue + - Dequeue only `size` times, and for each dequeued node, enqueue their children. + - Check if the node is the last one in its level and add it to the answer. *Implementation*: [source, javascript] ---- -include::interview-questions/diameter-of-binary-tree.js[tag=description] -include::interview-questions/diameter-of-binary-tree.js[tag=solution] +include::interview-questions/binary-tree-right-side-view.js[tags=description;solution] +---- + +This problem is also possible to be solved using DFS. The trick is to start with the right child and add it to the solution when it is the first one on its level. + +[source, javascript] +---- +include::interview-questions/binary-tree-right-side-view.js[tag=dfs] ---- -IMPLEMENTATION NOTES +The complexity of any of the BFS methods or DFS is similar. *Complexity Analysis*: -- Time: `O(?)`. WHY? -- Space: `O(?)`. WHY? +- Time: `O(n)`. We visit every node, once. +- Space: `O(n)`. For BFS, the worst-case space is given by the maximum *width*. That is when the binary tree is complete so that the last level would have `(n-1)/2` nodes, thus `O(n)`. For the DFS, the space complexity will be given by the tree's maximum *height*. In the worst-case, the binary tree is skewed to the right so that we will have an implicit call stack of size `n`. // [#linkedlist-q-FILENAME] diff --git a/book/content/part02/array.asc b/book/content/part02/array.asc index cec213fc..2e5aea39 100644 --- a/book/content/part02/array.asc +++ b/book/content/part02/array.asc @@ -293,7 +293,7 @@ maxSubArray([-3, 4,-1, 2, 1, -5]); // 6 (sum [4,-1, 2, 1]) maxSubArray([-2, 1, -3, 4, -1, 3, 1]); // 7 (sum [4,-1, 3, 1]) ---- -_Seen in interviews at: Amazon, Apple, Google, Microsoft, Facebook_ +// _Seen in interviews at: Amazon, Apple, Google, Microsoft, Facebook_ // end::array-q-max-subarray[] [source, javascript] @@ -320,7 +320,7 @@ maxProfit([5, 10, 5, 10]) // 5 (buying at 5 and selling at 10) ---- -_Seen in interviews at: Amazon, Facebook, Bloomberg_ +// _Seen in interviews at: Amazon, Facebook, Bloomberg_ // end::array-q-buy-sell-stock[] [source, javascript] diff --git a/book/content/part02/linked-list.asc b/book/content/part02/linked-list.asc index 409bab6e..eb008fec 100644 --- a/book/content/part02/linked-list.asc +++ b/book/content/part02/linked-list.asc @@ -301,7 +301,7 @@ mergeTwoLists(2->3->4, 1->2); // 1->2->2->3->4 mergeTwoLists(2->3->4,null); // 2->3->4 ---- -_Seen in interviews at: Amazon, Adobe, Microsoft, Google_ +// _Seen in interviews at: Amazon, Adobe, Microsoft, Google_ // end::linkedlist-q-merge-lists[] [source, javascript] @@ -329,7 +329,7 @@ hasSameData(hello, hel->lo); // true hasSameData(he->ll->o, h->i); // false ---- -_Seen in interviews at: Facebook_ +// _Seen in interviews at: Facebook_ // end::linkedlist-q-linkedlist-same-data[] [source, javascript] diff --git a/book/content/part02/queue.asc b/book/content/part02/queue.asc index 9930b9f1..9b760e1f 100644 --- a/book/content/part02/queue.asc +++ b/book/content/part02/queue.asc @@ -103,7 +103,7 @@ counter.request(3100); // 1 (last requests was 100 ms ago, > 10ms, so doesn't co counter.request(3105); // 2 (last requests was 5 ms ago, <= 10ms, so it counts) ---- -_Seen in interviews at: Google, Bloomberg, Yandex_ +// _Seen in interviews at: Google, Bloomberg, Yandex_ // end::queue-q-recent-counter[] @@ -135,7 +135,7 @@ expect(snakeGame.move('L')).toEqual(2); // 2 (ate food2) expect(snakeGame.move('U')).toEqual(-1); // -1 (hit wall) ---- -_Seen in interviews at: Amazon, Bloomberg, Apple_ +// _Seen in interviews at: Amazon, Bloomberg, Apple_ // end::queue-q-design-snake-game[] [source, javascript] diff --git a/book/content/part02/stack.asc b/book/content/part02/stack.asc index b46b5e3b..90b3a859 100644 --- a/book/content/part02/stack.asc +++ b/book/content/part02/stack.asc @@ -106,7 +106,7 @@ isParenthesesValid('[{]}'); // false (brakets are not closed in the right order) isParenthesesValid('([{)}]'); // false (closing is out of order) ---- -_Seen in interviews at: Amazon, Bloomberg, Facebook, Citadel_ +// _Seen in interviews at: Amazon, Bloomberg, Facebook, Citadel_ // end::stack-q-valid-parentheses[] [source, javascript] @@ -135,7 +135,7 @@ dailyTemperatures([30, 28, 50, 40, 30]); // [2 (to 50), 1 (to 28), 0, 0, 0] dailyTemperatures([73, 69, 72, 76, 73, 100]); // [3, 1, 1, 0, 1, 100] ---- -_Seen in interviews at: Amazon, Adobe, Cisco_ +// _Seen in interviews at: Amazon, Adobe, Cisco_ // end::stack-q-daily-temperatures[] [source, javascript] diff --git a/book/content/part03/tree-intro.asc b/book/content/part03/tree-intro.asc index e361ee5e..69c68ef3 100644 --- a/book/content/part03/tree-intro.asc +++ b/book/content/part03/tree-intro.asc @@ -12,7 +12,7 @@ A tree is a non-linear data structure where a node can have zero or more connect .Tree Data Structure: root node and descendants. image::image31.jpg[image,width=404,height=240] -As you can see in the picture above, this data structure resembles an inverted tree hence the name. It starts with a *root* node and *branch* off with its descendants, and finally *leaves*. +As you can see in the picture above, this data structure resembles an inverted tree, hence the name. It starts with a *root* node and *branch* off with its descendants, and finally *leaves*. ==== Implementing a Tree @@ -54,17 +54,17 @@ image::image31.jpg[image] ==== Types of Binary Trees -There are different kinds of trees depending on the restrictions. E.g. The trees that have two children or less are called *binary tree*, while trees with at most three children are called *Ternary Tree*. Since binary trees are most common we are going to cover them here and others in another chapter. +There are different kinds of trees, depending on the restrictions. E.g. The trees with two children or less are called *binary tree*, while trees with at most three children are called *Ternary Tree*. Since binary trees are the most common, we will cover them here and others in another chapter. ===== Binary Tree (((Binary Tree))) (((Data Structures, Non-Linear, Binary Tree))) -The binary restricts the nodes to have at most two children. Trees, in general, can have 3, 4, 23 or more, but not binary trees. +The binary restricts the nodes to have at most two children. Trees can have 0, 1, 2, 7, or more, but not binary trees. .Binary tree has at most 2 children while non-binary trees can have more. image::image32.png[image,width=321,height=193] -Binary trees are one of the most used kinds of tree, and they are used to build other data structures. +Binary trees are one of the most used kinds of trees, and they are used to build other data structures. .Binary Tree Applications - <> @@ -90,7 +90,7 @@ image::image33.png[image,width=348,height=189] (((Max-Heap))) (((Min-Heap))) (((Data Structures, Non-Linear, Binary Heap))) -The heap (max-heap) is a type of binary tree where the parent's value is higher than the value of both children. Opposed to the BST, the left child doesn’t have to be smaller than the right child. +The heap (max-heap) is a type of binary tree where the parent's value is higher than both children's value. Opposed to the BST, the left child doesn’t have to be smaller than the right child. .Heap vs BST image::image34.png[image,width=325,height=176] @@ -118,72 +118,86 @@ indexterm:[Runtime, Logarithmic] // tag::binary-tree-q-diameter-of-binary-tree[] ===== Binary Tree Diameter -*BT-1*) _Find the diameter of a binary tree. The diameter of a tree is defined as the longest possible path from two nodes (it doesn't need to include the root). The lenth of diameter is calculated by couting the number of edges on the path._ +*BT-1*) _Find the diameter of a binary tree. A tree's diameter is the longest possible path from two nodes (it doesn't need to include the root). The length of a diameter is calculated by counting the number of edges on the path._ // end::binary-tree-q-diameter-of-binary-tree[] -_Seen in interviews at: Facebook, Amazon, Google_ - -Example 1: - -[graphviz, tree-diameter-example-1, png] -.... -graph G { - 1 -- 2 [color=red] - 1 -- 3 [color=red] - - 2 -- 4 - 2 -- 5 [color=red] -} -.... - -[source, javascript] ----- -diameterOfBinaryTree(toBinaryTree([1,2,3,4,5])); // 3 (the path 3-1-2-5 or 3-1-2-4) ----- - -Example 2: - -[graphviz, tree-diameter-example-2, png] -.... -graph G { - 1 - 2 - 3 - 4 - 5 - 6 - "null" [color=white, fontcolor = white] - "null." [color=white, fontcolor = white] - 7 - 8 - "null.." [color=white, fontcolor = white] - "null..." [color=white, fontcolor = white] - 9 - - 1 -- 2 - 1 -- 3 - - 3 -- 4 [color=red] - 3 -- 5 [color=red] - - 4 -- 6 [color=red] - 4 -- "null." [color=white] - - 5 -- "null" [color=white] - 5 -- 7 [color=red] - - 6 -- 8 [color=red] - 6 -- "null.." [color=white] - - 7 -- "null..." [color=white] - 7 -- 9 [color=red] -} -.... +// _Seen in interviews at: Facebook, Amazon, Google_ + +// Example 1: +// [graphviz, tree-diameter-example-1, png] +// .... +// graph G { +// 1 -- 2 [color=red] +// 1 -- 3 [color=red] + +// 2 -- 4 +// 2 -- 5 [color=red] +// } +// .... + +// Example 2: +// [graphviz, tree-diameter-example-2, png] +// .... +// graph G { +// 1 +// 2 +// 3 +// 4 +// 5 +// 6 +// "null" [color=white, fontcolor = white] +// "null." [color=white, fontcolor = white] +// 7 +// 8 +// "null.." [color=white, fontcolor = white] +// "null..." [color=white, fontcolor = white] +// 9 + +// 1 -- 2 +// 1 -- 3 + +// 3 -- 4 [color=red] +// 3 -- 5 [color=red] + +// 4 -- 6 [color=red] +// 4 -- "null." [color=white] + +// 5 -- "null" [color=white] +// 5 -- 7 [color=red] + +// 6 -- 8 [color=red] +// 6 -- "null.." [color=white] + +// 7 -- "null..." [color=white] +// 7 -- 9 [color=red] +// } +// .... + +Examples: [source, javascript] ---- -diameterOfBinaryTree(toBinaryTree([1,2,3,null,null,4,5,6,null,null,7,8,null,null,9])); // 6 (the path 8-6-4-3-5-7-9) +/* 1 + / \ + 2 3 + / \ + 4 5 */ +diameterOfBinaryTree(toBinaryTree([1,2,3,4,5])); // 3 +// For len 3, the path could be 3-1-2-5 or 3-1-2-4 + +/* 1 + / \ + 2 3 + / \ + 4 5 + / \ + 6 7 + / \ + 8 9 */ +const array = [1,2,3,null,null,4,5,6,null,null,7,8,null,null,9]; +const tree = BinaryTreeNode.from(array); +diameterOfBinaryTree(tree); // 6 (path: 8-6-4-3-5-7-9) ---- Starter code: @@ -198,17 +212,37 @@ _Solution: <>_ -// tag::binary-tree-q-FILENAME[] -===== Recent Counter -*BT-2*) _._ +// tag::binary-tree-q-binary-tree-right-side-view[] +===== Binary Tree from right side view -Example: +*BT-2*) _Imagine that you are viewing the tree from the right side. What nodes would you see?_ + +// end::binary-tree-q-binary-tree-right-side-view[] + +// _Seen in interviews at: Facebook, Amazon, ByteDance (TikTok)._ + +Examples: [source, javascript] ---- +/* + 1 <- 1 (only node on level) + / \ +2 3 <- 3 (3 is the rightmost) + \ + 4 <- 4 (only node on level) */ +rightSideView(BinaryTreeNode.from([1, 2, 3, null, 4])); // [1, 3, 4] + +rightSideView(BinaryTreeNode.from([])); // [] +rightSideView(BinaryTreeNode.from([1, 2, 3, null, 5, null, 4, 6])); // [1, 3, 4, 6] +---- +Starter code: + +[source, javascript] +---- +include::../../interview-questions/binary-tree-right-side-view.js[tags=description;placeholder] ---- -_Seen in interviews at: X_ -// end::binary-tree-q-FILENAME[] +_Solution: <>_ diff --git a/book/interview-questions/binary-tree-right-side-view.js b/book/interview-questions/binary-tree-right-side-view.js new file mode 100644 index 00000000..52b8c3e2 --- /dev/null +++ b/book/interview-questions/binary-tree-right-side-view.js @@ -0,0 +1,59 @@ +const { Queue } = require('../../src/index'); + +// tag::description[] +/** + * Find the rightmost nodes by level. + * + * @example + * 1 <- 1 + * / \ + * 2 3 <- 3 + * \ + * 4 <- 4 + * + * @param {BinaryTreeNode} root - The root of the binary tree. + * @returns {number[]} - array with the rightmost nodes values. + */ +function rightSideView(root) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + if (!root) return []; + const queue = new Queue([root]); + const ans = []; + + while (queue.size) { + const { size } = queue; + for (let i = 0; i < size; i++) { + const node = queue.dequeue(); + if (i === size - 1) ans.push(node.value); + if (node.left) queue.enqueue(node.left); + if (node.right) queue.enqueue(node.right); + } + } + + return ans; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::dfs[] +function rightSideViewDfs(root) { + const ans = []; + + const dfs = (node, level = 0) => { + if (!node) return; + if (level === ans.length) ans.push(node.value); + dfs(node.right, level + 1); // right side first! + dfs(node.left, level + 1); + }; + + dfs(root); + return ans; +} +// end::dfs[] + +module.exports = { rightSideView, rightSideViewDfs }; diff --git a/book/interview-questions/binary-tree-right-side-view.spec.js b/book/interview-questions/binary-tree-right-side-view.spec.js new file mode 100644 index 00000000..59b0417f --- /dev/null +++ b/book/interview-questions/binary-tree-right-side-view.spec.js @@ -0,0 +1,24 @@ +const { rightSideView, rightSideViewDfs } = require('./binary-tree-right-side-view'); +const { BinaryTreeNode } = require('../../src/index'); + +[rightSideView, rightSideViewDfs].forEach((fn) => { + describe(`Binary Tree: ${fn.name}`, () => { + it('should work with null', () => { + const actual = null; + const expected = []; + expect(fn(actual)).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = BinaryTreeNode.from([1, 2, 3, null, 4]); + const expected = [1, 3, 4]; + expect(fn(actual)).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = BinaryTreeNode.from([1, 2, 3, null, 5, null, 4, 6]); + const expected = [1, 3, 4, 6]; + expect(fn(actual)).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/diameter-of-binary-tree.spec.js b/book/interview-questions/diameter-of-binary-tree.spec.js index 2d19358f..2bdba6d9 100644 --- a/book/interview-questions/diameter-of-binary-tree.spec.js +++ b/book/interview-questions/diameter-of-binary-tree.spec.js @@ -2,20 +2,13 @@ const { diameterOfBinaryTree } = require('./diameter-of-binary-tree'); const { BinaryTreeNode } = require('../../src/index'); describe('Binary Tree: Diameter', () => { - function toBinaryTree(array, index = 0) { - if (index >= array.length) return null; - const node = new BinaryTreeNode(array[index]); - node.left = toBinaryTree(array, index * 2 + 1); - node.right = toBinaryTree(array, index * 2 + 2); - return node; - } - it('should find the diameter', () => { - expect(diameterOfBinaryTree(toBinaryTree([1, 2, 3, 4, 5]))).toEqual(3); + const actual = BinaryTreeNode.from([1, 2, 3, 4, 5]); + expect(diameterOfBinaryTree(actual)).toEqual(3); }); it('should find the diameter when does not pass through the root node', () => { - const tree = [1, 2, 3, null, null, 4, 5, 6, null, null, 7, 8, null, null, 9]; - expect(diameterOfBinaryTree(toBinaryTree(tree))).toEqual(6); + const arr = [1, 2, 3, null, null, 4, 5, 6, null, null, 7, 8, null, null, 9]; + expect(diameterOfBinaryTree(BinaryTreeNode.from(arr))).toEqual(6); }); }); From bcb4c28089a96248ab9d623c25e1719e030caedc Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 2 Sep 2020 13:24:54 -0400 Subject: [PATCH 126/200] feat(BinaryTreeNode): add BinaryTreeNode.from --- package.json | 2 +- src/data-structures/trees/binary-tree-node.js | 15 ++ .../trees/binary-tree-node.spec.js | 229 +++++++++++------- 3 files changed, 157 insertions(+), 89 deletions(-) diff --git a/package.json b/package.json index 2c7642ab..db16380f 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ ], "scripts": { "test": "jest --verbose", - "watch": "jest --watch --verbose --coverage", + "watch": "jest --watch --coverage", "ci": "npx eslint src/ && jest --coverage", "coverage": "jest --coverage && open coverage/lcov-report/index.html", "coverage:win": "jest --coverage && cmd.exe /C start coverage/lcov-report/index.html", diff --git a/src/data-structures/trees/binary-tree-node.js b/src/data-structures/trees/binary-tree-node.js index 5008dcee..69ae1cbf 100644 --- a/src/data-structures/trees/binary-tree-node.js +++ b/src/data-structures/trees/binary-tree-node.js @@ -172,6 +172,21 @@ class BinaryTreeNode { this.meta.data = value; return this; } + + /** + * Convert Binary tree from an iterable (e.g. array) + * @param {array|string} iterable - The iterable + */ + static from(iterable = []) { + const toBinaryTree = (array, index = 0) => { + if (index >= array.length) return null; + const node = new BinaryTreeNode(array[index]); + node.setLeftAndUpdateParent(toBinaryTree(array, index * 2 + 1)); + node.setRightAndUpdateParent(toBinaryTree(array, index * 2 + 2)); + return node; + }; + return toBinaryTree(Array.from(iterable)); + } } BinaryTreeNode.RIGHT = RIGHT; diff --git a/src/data-structures/trees/binary-tree-node.spec.js b/src/data-structures/trees/binary-tree-node.spec.js index 3cb1f2d6..d24cb5bc 100644 --- a/src/data-structures/trees/binary-tree-node.spec.js +++ b/src/data-structures/trees/binary-tree-node.spec.js @@ -1,114 +1,167 @@ const { BinaryTreeNode } = require('../../index'); +const { LEFT, RIGHT } = BinaryTreeNode; + describe('Binary Tree Node', () => { let treeNode; - beforeEach(() => { - treeNode = new BinaryTreeNode('hola'); - }); - - it('should start with null parent', () => { - expect(treeNode.parent).toBe(null); - }); - - it('should start with empty metadata', () => { - expect(treeNode.meta).toEqual({}); - }); - - it('should hold a value', () => { - expect(treeNode.value).toBe('hola'); - }); - - it('should have a height 0', () => { - expect(treeNode.height).toBe(0); - }); - - it('should set/get left node', () => { - expect(treeNode.left).toBe(null); - const newNode = new BinaryTreeNode(1); - treeNode.setLeftAndUpdateParent(newNode); - expect(treeNode.left.value).toBe(1); - - expect(newNode.parent).toBe(treeNode); - expect(treeNode.height).toBe(1); - expect(treeNode.balanceFactor).toBe(1); - }); - - it('should set/get right node', () => { - expect(treeNode.right).toBe(null); - const newNode = new BinaryTreeNode(1); - treeNode.setRightAndUpdateParent(newNode); - - expect(treeNode.right.value).toBe(1); - expect(newNode.parent).toBe(treeNode); - expect(treeNode.height).toBe(1); - expect(treeNode.balanceFactor).toBe(-1); - }); - - describe('Family operations', () => { - let g; - let p; - let u; - let c; - let s; - + describe('with instance', () => { beforeEach(() => { - g = new BinaryTreeNode('grandparent'); - p = new BinaryTreeNode('parent'); - u = new BinaryTreeNode('uncle'); - c = new BinaryTreeNode('child'); - s = new BinaryTreeNode('sibling'); - - g.setRightAndUpdateParent(p); - g.setLeftAndUpdateParent(u); - p.setRightAndUpdateParent(c); - p.setLeftAndUpdateParent(s); + treeNode = new BinaryTreeNode('hola'); }); - it('should set heights', () => { - expect(g.height).toBe(2); - expect(g.balanceFactor).toBe(-1); - - expect(p.height).toBe(1); - expect(p.balanceFactor).toBe(0); + it('should start with null parent', () => { + expect(treeNode.parent).toBe(null); + }); - expect(u.height).toBe(0); - expect(u.balanceFactor).toBe(0); + it('should start with empty metadata', () => { + expect(treeNode.meta).toEqual({}); }); - it('should get the sibling', () => { - expect(c.sibling).toBe(s); - expect(p.sibling).toBe(u); + it('should hold a value', () => { + expect(treeNode.value).toBe('hola'); }); - it('should set leaf correctly', () => { - expect(c.isLeaf).toBe(true); - expect(u.isLeaf).toBe(true); - expect(p.isLeaf).toBe(false); - expect(g.isLeaf).toBe(false); + it('should have a height 0', () => { + expect(treeNode.height).toBe(0); }); - it('should get null if no sibling', () => { - expect(g.sibling).toBe(null); + it('should set/get left node', () => { + expect(treeNode.left).toBe(null); + const newNode = new BinaryTreeNode(1); + treeNode.setLeftAndUpdateParent(newNode); + expect(treeNode.left.value).toBe(1); + + expect(newNode.parent).toBe(treeNode); + expect(treeNode.height).toBe(1); + expect(treeNode.balanceFactor).toBe(1); }); - it('should get the uncle', () => { - expect(c.uncle).toBe(u); + it('should set/get right node', () => { + expect(treeNode.right).toBe(null); + const newNode = new BinaryTreeNode(1); + treeNode.setRightAndUpdateParent(newNode); + + expect(treeNode.right.value).toBe(1); + expect(newNode.parent).toBe(treeNode); + expect(treeNode.height).toBe(1); + expect(treeNode.balanceFactor).toBe(-1); }); - it('should get null if no uncle', () => { - expect(g.uncle).toBe(null); - expect(p.uncle).toBe(null); + describe('Family operations', () => { + let g; + let p; + let u; + let c; + let s; + + beforeEach(() => { + g = new BinaryTreeNode('grandparent'); + p = new BinaryTreeNode('parent'); + u = new BinaryTreeNode('uncle'); + c = new BinaryTreeNode('child'); + s = new BinaryTreeNode('sibling'); + + g.setRightAndUpdateParent(p); + g.setLeftAndUpdateParent(u); + p.setRightAndUpdateParent(c); + p.setLeftAndUpdateParent(s); + }); + + it('should set heights', () => { + expect(g.height).toBe(2); + expect(g.balanceFactor).toBe(-1); + + expect(p.height).toBe(1); + expect(p.balanceFactor).toBe(0); + + expect(u.height).toBe(0); + expect(u.balanceFactor).toBe(0); + }); + + it('should get the sibling', () => { + expect(c.sibling).toBe(s); + expect(p.sibling).toBe(u); + }); + + it('should set leaf correctly', () => { + expect(c.isLeaf).toBe(true); + expect(u.isLeaf).toBe(true); + expect(p.isLeaf).toBe(false); + expect(g.isLeaf).toBe(false); + }); + + it('should get null if no sibling', () => { + expect(g.sibling).toBe(null); + }); + + it('should get the uncle', () => { + expect(c.uncle).toBe(u); + }); + + it('should get null if no uncle', () => { + expect(g.uncle).toBe(null); + expect(p.uncle).toBe(null); + }); + + it('true if is parent left child', () => { + expect(s.isParentLeftChild).toBe(true); + expect(s.isParentRightChild).toBe(false); + }); + + it('true if is parent left child', () => { + expect(c.isParentLeftChild).toBe(false); + expect(c.isParentRightChild).toBe(true); + }); }); + }); - it('true if is parent left child', () => { - expect(s.isParentLeftChild).toBe(true); - expect(s.isParentRightChild).toBe(false); + describe('with static methods', () => { + it('should work with null', () => { + const tree = BinaryTreeNode.from(); + expect(tree).toEqual(null); }); - it('true if is parent left child', () => { - expect(c.isParentLeftChild).toBe(false); - expect(c.isParentRightChild).toBe(true); + it('should build from array', () => { + /* + 0 + / \ + 1 2 + / \ \ + 3 5 4 + */ + const tree = BinaryTreeNode.from([0, 1, 2, 3, 5, null, 4]); + expect(tree.toValues()).toEqual({ + value: 0, + left: 1, + right: 2, + parent: null, + parentSide: null, + }); + + expect(tree.left.toValues()).toEqual({ + value: 1, + left: 3, + right: 5, + parent: 0, + parentSide: LEFT, + }); + + expect(tree.right.toValues()).toEqual({ + value: 2, + left: null, + right: 4, + parent: 0, + parentSide: RIGHT, + }); + + expect(tree.right.right.toValues()).toEqual({ + value: 4, + left: null, + right: null, + parent: 2, + parentSide: RIGHT, + }); }); }); }); From 86201fb215132e5542d1c1e73528270853244091 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 2 Sep 2020 13:35:17 -0400 Subject: [PATCH 127/200] chore(book/exercises): bst exercises after traversals --- book/D-interview-questions-solutions.asc | 44 +++--- .../part03/binary-search-tree-traversal.asc | 138 ++++++++++++++++++ book/content/part03/tree-intro.asc | 137 ----------------- 3 files changed, 161 insertions(+), 158 deletions(-) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index ec1a86e0..6adf64c0 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -83,9 +83,9 @@ A better solution is to eliminate the 2nd for loop and only do one pass. Algorithm: - Do one pass through all the prices - - Keep track of the minimum price seen so far. - - calculate `profit = currentPrice - minPriceSoFar` - - Keep track of the maximun profit seen so far. + ** Keep track of the minimum price seen so far. + ** calculate `profit = currentPrice - minPriceSoFar` + ** Keep track of the maximun profit seen so far. - Return maxProfit. [source, javascript] @@ -118,8 +118,8 @@ Another case to take into consideration is that lists might have different lengt - Have a pointer for each list - While there's a pointer that is not null, visite them - - Compare each list node's value and take the smaller one. - - Advance the pointer of the taken node to the next one. + ** Compare each list node's value and take the smaller one. + ** Advance the pointer of the taken node to the next one. *Implementation*: @@ -163,8 +163,8 @@ A better way to solve this problem is iterating over each character on both list - Set a pointer to iterate over each node in the lists. - For each node, have an index (starting at zero) and compare if both lists have the same data. - - When the index reaches the last character on the current node, we move to the next node. - - If we found that a character from one list doesn't match the other, we return `false`. + ** When the index reaches the last character on the current node, we move to the next node. + ** If we found that a character from one list doesn't match the other, we return `false`. *Implementation*: @@ -206,8 +206,8 @@ This is a parsing problem, and usually, stacks are good candidates for them. - Create a mapping for each opening bracket to its closing counterpart. - Iterate through the string - - When we found an opening bracket, insert the corresponding closing bracket into the stack. - - When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. + ** When we found an opening bracket, insert the corresponding closing bracket into the stack. + ** When we found a closing bracket, pop from the stack and make sure it corresponds to the current character. - Check the stack is empty. If there's a leftover, it means that something didn't close properly. *Implementation*: @@ -242,10 +242,10 @@ Here's an idea: start backward, so we know when there's a warmer temperature bef *Algorithm*: - Traverse the daily temperatures backward - - Push each temperature to a stack. - - While the current temperature is larger than the one at the top of the stack, pop it. - - If the stack is empty, then there's no warmer weather ahead, so it's 0. - - If the stack has an element, calculate the index delta. + ** Push each temperature to a stack. + ** While the current temperature is larger than the one at the top of the stack, pop it. + ** If the stack is empty, then there's no warmer weather ahead, so it's 0. + ** If the stack has an element, calculate the index delta. *Implementation*: @@ -311,8 +311,8 @@ This game is perfect to practice working with Queues. There are at least two opp - If the new location has food, remove that eaten food from its queue and place the next food on the map (if any). - If the new position doesn't have food, remove the tail of the snake since it moved. - If the snake new position hits itself, game over (return -1). To make this check, we have 2 options: - - Queue: we can visit all the elements on the snake's queue (body) and check if a new position collides. That's `O(n)` - - Set: we can maintain a `set` with all the snake locations, so the check is `O(1)`. + ** Queue: we can visit all the elements on the snake's queue (body) and check if a new position collides. That's `O(n)` + ** Set: we can maintain a `set` with all the snake locations, so the check is `O(1)`. - Move the snake's head to a new location (enqueue) - Return the score (snake's length - 1); @@ -340,7 +340,7 @@ As you can see, we opted for using a set to trade speed for memory. :leveloffset: -1 [#binary-tree-q-diameter-of-binary-tree] -include::content/part03/tree-intro.asc[tag=binary-tree-q-diameter-of-binary-tree] +include::content/part03/binary-search-tree-traversal.asc[tag=binary-tree-q-diameter-of-binary-tree] We are asked to find the longest path on a binary tree that might or might not pass through the root node. @@ -384,7 +384,7 @@ We are using `Math.max` to keep track of the longest diameter seen. [#binary-tree-q-binary-tree-right-side-view] -include::content/part03/tree-intro.asc[tag=binary-tree-q-binary-tree-right-side-view] +include::content/part03/binary-search-tree-traversal.asc[tag=binary-tree-q-binary-tree-right-side-view] The first thing that might come to mind when you have to visit a tree, level by level, is BFS. We can visit the tree using a Queue and keep track when a level ends, and the new one starts. @@ -394,15 +394,17 @@ Since during BFS, we dequeue one node and enqueue their two children (left and r .There are several ways to solve this problem using BFS. Here are some ideas: - *1 Queue + Sentinel node*: we can use a special character in the `Queue` like `'*'` or `null` to indicate the level's change. So, we would start something like this `const queue = new Queue([root, '*']);`. - *2 Queues*: using a "special" character might be seen as hacky, so you can also opt to keep two queues: one for the current level and another for the next level. -- *1 Queue + size tracking*: we track the Queue's `size` before the children are enqueued. That way, we know where the current level ends. We are going to implement this one. +- *1 Queue + size tracking*: we track the Queue's `size` before the children are enqueued. That way, we know where the current level ends. + +We are going to implement BFS with "1 Queue + size tracking", since it's arguably the most elegant. *Algorithm*: - Enqueue root - While the queue has an element - - Check the current size of the queue - - Dequeue only `size` times, and for each dequeued node, enqueue their children. - - Check if the node is the last one in its level and add it to the answer. + ** Check the current size of the queue + ** Dequeue only `size` times, and for each dequeued node, enqueue their children. + ** Check if the node is the last one in its level and add it to the answer. *Implementation*: diff --git a/book/content/part03/binary-search-tree-traversal.asc b/book/content/part03/binary-search-tree-traversal.asc index 974c6fbc..7b40f9bd 100644 --- a/book/content/part03/binary-search-tree-traversal.asc +++ b/book/content/part03/binary-search-tree-traversal.asc @@ -92,3 +92,141 @@ If we have the following tree: ---- Post-order traverval will return `3, 4, 5, 15, 40, 30, 10`. + + +==== Practice Questions +(((Interview Questions, Binary Tree))) + + +// tag::binary-tree-q-diameter-of-binary-tree[] +===== Binary Tree Diameter + +*BT-1*) _Find the diameter of a binary tree. A tree's diameter is the longest possible path from two nodes (it doesn't need to include the root). The length of a diameter is calculated by counting the number of edges on the path._ + +// end::binary-tree-q-diameter-of-binary-tree[] + +// _Seen in interviews at: Facebook, Amazon, Google_ + +// Example 1: +// [graphviz, tree-diameter-example-1, png] +// .... +// graph G { +// 1 -- 2 [color=red] +// 1 -- 3 [color=red] + +// 2 -- 4 +// 2 -- 5 [color=red] +// } +// .... + +// Example 2: +// [graphviz, tree-diameter-example-2, png] +// .... +// graph G { +// 1 +// 2 +// 3 +// 4 +// 5 +// 6 +// "null" [color=white, fontcolor = white] +// "null." [color=white, fontcolor = white] +// 7 +// 8 +// "null.." [color=white, fontcolor = white] +// "null..." [color=white, fontcolor = white] +// 9 + +// 1 -- 2 +// 1 -- 3 + +// 3 -- 4 [color=red] +// 3 -- 5 [color=red] + +// 4 -- 6 [color=red] +// 4 -- "null." [color=white] + +// 5 -- "null" [color=white] +// 5 -- 7 [color=red] + +// 6 -- 8 [color=red] +// 6 -- "null.." [color=white] + +// 7 -- "null..." [color=white] +// 7 -- 9 [color=red] +// } +// .... + +Examples: + +[source, javascript] +---- +/* 1 + / \ + 2 3 + / \ + 4 5 */ +diameterOfBinaryTree(toBinaryTree([1,2,3,4,5])); // 3 +// For len 3, the path could be 3-1-2-5 or 3-1-2-4 + +/* 1 + / \ + 2 3 + / \ + 4 5 + / \ + 6 7 + / \ + 8 9 */ +const array = [1,2,3,null,null,4,5,6,null,null,7,8,null,null,9]; +const tree = BinaryTreeNode.from(array); +diameterOfBinaryTree(tree); // 6 (path: 8-6-4-3-5-7-9) +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/diameter-of-binary-tree.js[tags=description;placeholder] +---- + + +_Solution: <>_ + + + + +// tag::binary-tree-q-binary-tree-right-side-view[] +===== Binary Tree from right side view + +*BT-2*) _Imagine that you are viewing the tree from the right side. What nodes would you see?_ + +// end::binary-tree-q-binary-tree-right-side-view[] + +// _Seen in interviews at: Facebook, Amazon, ByteDance (TikTok)._ + +Examples: + +[source, javascript] +---- +/* + 1 <- 1 (only node on level) + / \ +2 3 <- 3 (3 is the rightmost) + \ + 4 <- 4 (only node on level) */ +rightSideView(BinaryTreeNode.from([1, 2, 3, null, 4])); // [1, 3, 4] + +rightSideView(BinaryTreeNode.from([])); // [] +rightSideView(BinaryTreeNode.from([1, 2, 3, null, 5, null, 4, 6])); // [1, 3, 4, 6] +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/binary-tree-right-side-view.js[tags=description;placeholder] +---- + +_Solution: <>_ + diff --git a/book/content/part03/tree-intro.asc b/book/content/part03/tree-intro.asc index 69c68ef3..bd92a6c7 100644 --- a/book/content/part03/tree-intro.asc +++ b/book/content/part03/tree-intro.asc @@ -109,140 +109,3 @@ image::image35.png[image,width=258,height=169] Heap is better at finding max or min values in constant time *O(1)*, while a balanced BST is good a finding any element in *O(log n)*. Heaps are often used to implement priority queues while BST is used when you need every value sorted. **** indexterm:[Runtime, Logarithmic] - - -==== Practice Questions -(((Interview Questions, Binary Tree))) - - -// tag::binary-tree-q-diameter-of-binary-tree[] -===== Binary Tree Diameter - -*BT-1*) _Find the diameter of a binary tree. A tree's diameter is the longest possible path from two nodes (it doesn't need to include the root). The length of a diameter is calculated by counting the number of edges on the path._ - -// end::binary-tree-q-diameter-of-binary-tree[] - -// _Seen in interviews at: Facebook, Amazon, Google_ - -// Example 1: -// [graphviz, tree-diameter-example-1, png] -// .... -// graph G { -// 1 -- 2 [color=red] -// 1 -- 3 [color=red] - -// 2 -- 4 -// 2 -- 5 [color=red] -// } -// .... - -// Example 2: -// [graphviz, tree-diameter-example-2, png] -// .... -// graph G { -// 1 -// 2 -// 3 -// 4 -// 5 -// 6 -// "null" [color=white, fontcolor = white] -// "null." [color=white, fontcolor = white] -// 7 -// 8 -// "null.." [color=white, fontcolor = white] -// "null..." [color=white, fontcolor = white] -// 9 - -// 1 -- 2 -// 1 -- 3 - -// 3 -- 4 [color=red] -// 3 -- 5 [color=red] - -// 4 -- 6 [color=red] -// 4 -- "null." [color=white] - -// 5 -- "null" [color=white] -// 5 -- 7 [color=red] - -// 6 -- 8 [color=red] -// 6 -- "null.." [color=white] - -// 7 -- "null..." [color=white] -// 7 -- 9 [color=red] -// } -// .... - -Examples: - -[source, javascript] ----- -/* 1 - / \ - 2 3 - / \ - 4 5 */ -diameterOfBinaryTree(toBinaryTree([1,2,3,4,5])); // 3 -// For len 3, the path could be 3-1-2-5 or 3-1-2-4 - -/* 1 - / \ - 2 3 - / \ - 4 5 - / \ - 6 7 - / \ - 8 9 */ -const array = [1,2,3,null,null,4,5,6,null,null,7,8,null,null,9]; -const tree = BinaryTreeNode.from(array); -diameterOfBinaryTree(tree); // 6 (path: 8-6-4-3-5-7-9) ----- - -Starter code: - -[source, javascript] ----- -include::../../interview-questions/diameter-of-binary-tree.js[tags=description;placeholder] ----- - - -_Solution: <>_ - - - - -// tag::binary-tree-q-binary-tree-right-side-view[] -===== Binary Tree from right side view - -*BT-2*) _Imagine that you are viewing the tree from the right side. What nodes would you see?_ - -// end::binary-tree-q-binary-tree-right-side-view[] - -// _Seen in interviews at: Facebook, Amazon, ByteDance (TikTok)._ - -Examples: - -[source, javascript] ----- -/* - 1 <- 1 (only node on level) - / \ -2 3 <- 3 (3 is the rightmost) - \ - 4 <- 4 (only node on level) */ -rightSideView(BinaryTreeNode.from([1, 2, 3, null, 4])); // [1, 3, 4] - -rightSideView(BinaryTreeNode.from([])); // [] -rightSideView(BinaryTreeNode.from([1, 2, 3, null, 5, null, 4, 6])); // [1, 3, 4, 6] ----- - -Starter code: - -[source, javascript] ----- -include::../../interview-questions/binary-tree-right-side-view.js[tags=description;placeholder] ----- - -_Solution: <>_ From 1bfe5229c02a16d96b7b00d4baf3081a88929bd7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 2 Sep 2020 17:54:34 +0000 Subject: [PATCH 128/200] :bookmark: chore(release): 1.15.0 # [1.15.0](https://github.com/amejiarosario/dsa.js/compare/1.14.0...1.15.0) (2020-09-02) ### Bug Fixes * **book/solutions:** fix missing solutions ([464417e](https://github.com/amejiarosario/dsa.js/commit/464417e37ccde00d56d8ebb9c0d0ddc9e510e368)) ### Features * **BinaryTreeNode:** add BinaryTreeNode.from ([bcb4c28](https://github.com/amejiarosario/dsa.js/commit/bcb4c28089a96248ab9d623c25e1719e030caedc)) * **book/binary-tree:** add right side view exercise and solution ([28346a4](https://github.com/amejiarosario/dsa.js/commit/28346a448e7f1be640751098b4a954ac04dd0aad)) * **book/bt:** add binary tree diameter problem ([068dd9c](https://github.com/amejiarosario/dsa.js/commit/068dd9cc66e5a3050cc44d4cd3a05eb15f8c00d1)) --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66d2c6a6..20a05bd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [1.15.0](https://github.com/amejiarosario/dsa.js/compare/1.14.0...1.15.0) (2020-09-02) + + +### Bug Fixes + +* **book/solutions:** fix missing solutions ([464417e](https://github.com/amejiarosario/dsa.js/commit/464417e37ccde00d56d8ebb9c0d0ddc9e510e368)) + + +### Features + +* **BinaryTreeNode:** add BinaryTreeNode.from ([bcb4c28](https://github.com/amejiarosario/dsa.js/commit/bcb4c28089a96248ab9d623c25e1719e030caedc)) +* **book/binary-tree:** add right side view exercise and solution ([28346a4](https://github.com/amejiarosario/dsa.js/commit/28346a448e7f1be640751098b4a954ac04dd0aad)) +* **book/bt:** add binary tree diameter problem ([068dd9c](https://github.com/amejiarosario/dsa.js/commit/068dd9cc66e5a3050cc44d4cd3a05eb15f8c00d1)) + # [1.14.0](https://github.com/amejiarosario/dsa.js/compare/1.13.0...1.14.0) (2020-08-31) diff --git a/package-lock.json b/package-lock.json index ad15ca99..7ff12299 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.14.0", + "version": "1.15.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index db16380f..1abab67a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.14.0", + "version": "1.15.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From d18186b61c260e3ae2cc1267cadd16c8cb453e00 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Thu, 3 Sep 2020 14:53:55 -0400 Subject: [PATCH 129/200] feat(book/hashmap): add exercises and solutions --- book/D-interview-questions-solutions.asc | 171 +++++++++++++++++- book/content/part03/hashmap.asc | 120 +++++++++--- ...-substring-without-repeating-characters.js | 14 ++ ...tring-without-repeating-characters.spec.js | 5 + .../subarray-sum-equals-k.js | 58 ++++++ .../subarray-sum-equals-k.spec.js | 24 +++ book/interview-questions/two-sum.js | 34 ++++ book/interview-questions/two-sum.spec.js | 28 +++ 8 files changed, 421 insertions(+), 33 deletions(-) create mode 100644 book/interview-questions/longest-substring-without-repeating-characters.js create mode 100644 book/interview-questions/longest-substring-without-repeating-characters.spec.js create mode 100644 book/interview-questions/subarray-sum-equals-k.js create mode 100644 book/interview-questions/subarray-sum-equals-k.spec.js create mode 100644 book/interview-questions/two-sum.js create mode 100644 book/interview-questions/two-sum.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 6adf64c0..71e65e48 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -196,11 +196,11 @@ If the index overflows, it moves to the next node and reset the index to zero. [#stack-q-valid-parentheses] include::content/part02/stack.asc[tag=stack-q-valid-parentheses] -.We need to validate that brackets are properly opened and closed, following these rules: +.We need to validate that brackets are correctly opened and closed, following these rules: - An opened bracket must be close by the same type. - Open brackets mush be closed in the correct order. -This is a parsing problem, and usually, stacks are good candidates for them. +We are facing a parsing problem, and usually, stacks are good candidates for them. *Algorithm*: @@ -391,8 +391,8 @@ We can visit the tree using a Queue and keep track when a level ends, and the ne Since during BFS, we dequeue one node and enqueue their two children (left and right), we might have two levels (current and next one). For this problem, we need to know what the last node on the current level is. -.There are several ways to solve this problem using BFS. Here are some ideas: -- *1 Queue + Sentinel node*: we can use a special character in the `Queue` like `'*'` or `null` to indicate the level's change. So, we would start something like this `const queue = new Queue([root, '*']);`. +.There are several ways to solve this problem by using BFS. Here are some ideas: +- *1 Queue + Sentinel node*: we can use a special character in the `Queue` like `'*'` or `null` to indicate a level change. So, we would start something like this `const queue = new Queue([root, '*']);`. - *2 Queues*: using a "special" character might be seen as hacky, so you can also opt to keep two queues: one for the current level and another for the next level. - *1 Queue + size tracking*: we track the Queue's `size` before the children are enqueued. That way, we know where the current level ends. @@ -428,8 +428,164 @@ The complexity of any of the BFS methods or DFS is similar. - Space: `O(n)`. For BFS, the worst-case space is given by the maximum *width*. That is when the binary tree is complete so that the last level would have `(n-1)/2` nodes, thus `O(n)`. For the DFS, the space complexity will be given by the tree's maximum *height*. In the worst-case, the binary tree is skewed to the right so that we will have an implicit call stack of size `n`. -// [#linkedlist-q-FILENAME] -// include::content/part02/linked-list.asc[tag=linkedlist-q-FILENAME] + +:leveloffset: +1 + +=== Solutions for Hash Map Questions +(((Interview Questions Solutions, Hash Map))) + +:leveloffset: -1 + +[#hashmap-q-two-sum] +include::content/part03/hashmap.asc[tag=hashmap-q-two-sum] + +This simple problem can have many solutions; let's explore some. + +_Brute force_ + +One brute force approach could be doing two for loops. We sum two different numbers and check if they add up to the target. If yes, we return, and if not, we keep increasing the indices until we check every possible pair. + +[source, javascript] +---- +include::interview-questions/two-sum.js[tags=twoSumBrute] +---- + +This approach's time complexity is `O(n^2)`, because we visit every number twice in the worst-case. While the space complexity is `O(1)`. + +Can we trade space for time? Yes! + +_Map_ + +Based on `nums[i] + nums[j] === target` we can say that `num[j] === target - nums[i]`. We can do one pass and check if we have seen any number equal to `target - nums[i]`. A map is perfect for this job. We could have a HashMap that maps `num` to `index`. Let's see the algorithms to make it work. + + +*Algorithm*: + +* Visit every number once +** Calculate the complement `target - nums[i]`. +** If the complement exists, return its index and the current index. +** If not, save the complement and the index number. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/two-sum.js[tags=description;solution] +---- + +*Complexity Analysis*: + +- Time: `O(n)`. We visit every number once. +- Space: `O(n)`. In the worst-case scenario, we don't find the target, and we ended up with a map with all the numbers from the array. + + +[#hashmap-q-subarray-sum-equals-k] +include::content/part03/hashmap.asc[tag=hashmap-q-subarray-sum-equals-k] + +This problem has multiple ways to solve it. Let's explore some. + +_Brute force_ + +The most straightforward one is to convert the requirements into code: +generate all possible subarrays, add them up, and check how many are equal to k. + +[source, javascript] +---- +include::interview-questions/subarray-sum-equals-k.js[tags=subarraySumBrute1] +---- + +This solution's time complexity is `O(n^3)` because of the 3 nested loops. + +How can we do better? Notice that the last for loop, compute the sum repeatedly just to add one more. +Let's fix that! + +_Cummulative Sum_ + +For this solution, instead of computing the sum from `i` to `j` all the time. We can calculate a cumulative sum. Every time we see a new number, we add it to the aggregate. + +Since we want all possible subarray, We can increase `i` and get sum for each: + +[source, javascript] +---- +array = [1, 2, 3, 0, 1, 4, 0, 5]; + +// cummulative sum from left to right with i = 0 +sum = [1, 3, 6, 6, 7, 11, 11, 16]; +// cummulative sum from left to right with i = 1 +sum = [2, 5, 5, 6, 10, 10, 15]; +// cummulative sum from left to right with i = 2 +sum = [3, 3, 4, 8, 8, 13]; +// ... and so on ... +// cummulative sum from left to right with i = 7 +sum = [5]; +---- + +Here's the code: + +[source, javascript] +---- +include::interview-questions/subarray-sum-equals-k.js[tags=subarraySumBrute1] +---- + +The time complexity for this solution is better, `O(n^2)`. Can we still do better? + +_Map_ + +Let's get the intution from our previous cummulative sum: + +[source, javascript] +---- +subarraySum([1, 2, 3, 0, 1, 4, 0, 5], 5); // k = 5 + +// cummulative sum from left to right is +sum = [1, 3, 6, 6, 7, 11, 11, 16]; +// ^ ^ +---- + +Notice that when the array has a 0, the cumulative sum has a repeated number. If you subtract those numbers, it will give you zero. In the same way, If you take two other ranges and subtract them (`sum[j] - sum[i]`), it will give you the sum of that range `sum(num[i]...num[j])`. + +For instance, if we take the index `2` and `0` (with values 6 and 1) and susbtract them we get `6-1=5`. To verify we can add the array values from index 0 to 2, `sum([1, 2, 3]) === 5`. + +With that intuition, we can use a Map to keep track of the aggregated sum and the number of times that sum. + +*Algorithm*: + +* Start sum at 0 +* Visit every number on the array +** Compute the cumulative sum +** Check if `sum - k` exits; if so, it means that there's a subarray that adds up to k. +** Save the sum and the number of times that it has occurred. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/subarray-sum-equals-k.js[tags=description;solution] +---- + +You might wonder, what the map is initialized with `[0, 1]`. Consider this test case: + +[source, javascript] +---- +subarraySum([1], 1); // k = 1 +---- + +The sum is 1, however `sum - k` is `0`. If it doesn't exist on the map, we will get the wrong answer since that number adds up to `k`. We need to add an initial case on the map: `map.set(0, 1)`. If `nums[i] - k = 0`, then that means that `nums[i] = k` and should be part of the solution. + +*Complexity Analysis*: + +- Time: `O(n)`. We visit every number once. +- Space: `O(n)`. The map size will be the same as the original array. + +// :leveloffset: +1 + +// === Solutions for TOPIC Questions +// (((Interview Questions Solutions, TOPIC))) + +// :leveloffset: -1 + +// [#TOPIC-q-FILENAME] +// include::content/part03/TOPIC_FILE.asc[tag=TOPIC-q-FILENAME] // RESTATE REQUIREMENTS AND DESCRIPTIONS @@ -444,8 +600,7 @@ The complexity of any of the BFS methods or DFS is similar. // [source, javascript] // ---- -// include::interview-questions/FILENAME.js[tag=description] -// include::interview-questions/FILENAME.js[tag=solution] +// include::interview-questions/FILENAME.js[tags=description;solution] // ---- // IMPLEMENTATION NOTES diff --git a/book/content/part03/hashmap.asc b/book/content/part03/hashmap.asc index 8bf36ede..ec8d8ea4 100644 --- a/book/content/part03/hashmap.asc +++ b/book/content/part03/hashmap.asc @@ -12,7 +12,7 @@ A HashMap is a Map implementation. HashMaps are composed of two things: 1) a _hash function_ and 2) a bucket _array_ to store values. -Before going into the implementation details let’s give an overview of how it works. Let’s say we want to keep a tally of things and animals: +Before going into the implementation details, let’s give an overview of how it works. Let’s say we want to keep a tally of things and animals: .HashMap example [source, javascript] @@ -31,11 +31,11 @@ image::image41.png[image,width=528,height=299] 1. We use a *hash function* to transform the keys (e.g., dog, cat, rat, …) into an array index. This _array_ is called *bucket*. 2. The bucket holds the values or list of values in case of collisions. -In the illustration, we have a bucket size of 10. In bucket 0, we have a collision. Both `cat` and `art` keys map to the same bucket even thought their hash codes are different. +In the illustration, we have a bucket size of 10. In bucket 0, we have a collision. Both `cat` and `art` keys map to the same bucket even though their hash codes are different. In a HashMap, a *collision* is when different keys lead to the same index. They are nasty for performance since it can reduce the search time from *O(1)* to *O(n)*. -Having a big bucket size can avoid a collision but also can waste too much memory. We are going to build an _optimized_ HashMap that re-sizes itself when it is getting full. This auto-resizing avoids collisions and don't need to allocate too much memory upfront. Let’s start with the *hash function*. +Having a big bucket size can avoid a collision but also can waste too much memory. We are going to build an _optimized_ HashMap that resizes itself when it is getting full. This auto-resizing avoids collisions and don't need to allocate too much memory upfront. Let’s start with the *hash function*. ===== Designing an optimized hash function @@ -43,7 +43,7 @@ To minimize collisions, we need to create an excellent hash function. IMPORTANT: A *perfect* hash function is one that assigns a unique array index for every different key. -It’s no practical and memory-wise wasteful to have a perfect hash function, so we are going to shoot for a cost-effective hash function instead. +It’s no practical and memory-wise wasteful to have a perfect hash function, so we will shoot for a cost-effective hash function instead. .To recap: - A hash function converts keys into array indices. @@ -51,11 +51,11 @@ It’s no practical and memory-wise wasteful to have a perfect hash function, so 1. *Hash Code*: maps any key into an integer (unbonded) 2. *Compression function*: maps an arbitrary integer to integer in the range of [0… BUCKET_SIZE -1]. -Before doing a great hash function, let's see what a lousy hash function looks like. 😉 +Before doing an excellent hash function, let's see what a lousy hash function looks like. 😉 ====== Analysing collisions on bad hash code functions -The goal of a hash code function is to convert any value given into a positive integer — a common way to accomplish with summing each string’s Unicode value. +A hash code function's goal is to convert any value given into a positive integer — a common way to accomplish with summing each string’s Unicode value. .Naïve hashing function implementation [source, javascript] @@ -72,7 +72,7 @@ The `charCodeAt()` method returns an integer between `0` and `65535` representin The `codePointAt()` method returns a non-negative integer that is the Unicode code point value. **** -With this function we have the can convert some keys to numbers as follows: +With this function, we have the can convert some keys to numbers as follows: .Hashing examples [source, javascript] @@ -82,7 +82,7 @@ include::{codedir}/data-structures/maps/hash-maps/hashing.js[tag=naiveHashCodeEx Notice that `rat` and `art` have the same hash code! These are collisions that we need to solve. -Collisions happened because we are adding the letter's Unicode and are not taking the order into account nor the type. We can do better by offsetting the character value based on their position in the string. We can also add the object type, so number `10` produce different output than string `'10'`. +Collisions happened because we add the letter's Unicode and are not taking the order into account or the type. We can do better by offsetting the character value based on their position in the string. We can also add the object type, so number `10` produce different output than the string `'10'`. .Hashing function implementation that offset character value based on the position [source, javascript] @@ -109,7 +109,7 @@ BigInt has no virtual limits (until you run out of physical memory). It uses the ---- **** -As you can imagine, summing 20bits per letter leads to a humongous number! That's the case even for three letters words. We are using `BigInt`, so it doesn’t overflow. +As you can imagine, summing 20bits per letter leads to a massive number! That's the case even for three-letter words. We are using `BigInt`, so it doesn’t overflow. .Verifying there's not hashing code duplicates [source, javascript] @@ -117,9 +117,9 @@ As you can imagine, summing 20bits per letter leads to a humongous number! That' include::{codedir}/data-structures/maps/hash-maps/hashing.js[tag=hashCodeOffsetExample, indent=0] ---- -We don’t have duplicates anymore! If the keys have different content or type, they have a different hash code. However, we need to represent these unbounded integers to finite buckets in an array. We do that using *compression function*. This function can be as simple as `% BUCKET_SIZE`. +We don’t have duplicates anymore! If the keys have different content or type, they have distinct hash codes. However, we need to represent these unbounded integers to finite buckets in an array. We do that using *compression function*. This function can be as simple as `% BUCKET_SIZE`. -However, there’s an issue with the last implementation. It doesn’t matter how enormous (and different) is the hash code number if we at the end use the modulus to get an array index. The part of the hash code that truly matters is the last bits. +However, there’s an issue with the last implementation. It doesn’t matter how enormous (and different) is the hash code number if we, in the end, use the modulus to get an array index. The part of the hash code that truly matters is the last bits. .Look at this example with a bucket size of 4. [source, javascript] @@ -131,9 +131,9 @@ However, there’s an issue with the last implementation. It doesn’t matter ho 50 % 4 //↪️ 2 ---- -All the hash codes are different and still we get many collisions! [big]#😱# +All the hash codes are different, and still, we get many collisions! [big]#😱# -Based on numbers properties, using a prime number as the modulus produce fewer collisions. +Based on numbers properties, using a prime number as the modulus produces fewer collisions. .Let’s see what happens if the bucket size is a prime number: [source, javascript] @@ -149,7 +149,7 @@ Now it’s more evenly distributed!! [big]#😎👍# .So, to sum up: * Bucket size should always be a *prime number*, so data is distributed more evenly and minimized collisions. -* Hash code doesn’t have to be too big. At the end what matters is the few last digits. +* Hash code doesn’t have to be too big. In the end, what matters is the few last digits. Let’s design a better HashMap with what we learned. @@ -171,9 +171,9 @@ Take a look at the following function: include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=hashFunction, indent=0] ---- -Is somewhat similar to what we did before, in the sense that we use each letter’s Unicode is used to compute the hash. The difference is: +It is somewhat similar to what we did before, in the sense that we use each letter’s Unicode to compute the hash. The difference is: -1. We are using the XOR bitwise operation (`^`) to produce an *avalanche effect*, where a small change in two strings produces completely different hash codes. E.g. +1. We are using the XOR bitwise operation (`^`) to produce an *avalanche effect*, where a small change in two strings makes completely different hash codes. E.g. .Hash Code example using FVN1a [source, javascript] @@ -182,9 +182,9 @@ hashCode('cat') //↪️ 4201630708 hashCode('cats') //↪️ 3304940933 ---- -A one letter change produce a very different output. +A one-letter change produces a very different output. -We are using the FVN-1a prime number (`16777619`) and the offset (`2166136261`) to reduce collisions even further. If you are curious where these numbers come from check out this http://bit.ly/fvn-1a[link]. +We are using the FVN-1a prime number (`16777619`) and the offset (`2166136261`) to reduce collisions even further if you are curious where these numbers come from, check out this http://bit.ly/fvn-1a[link]. FVN-1a hash function is a good trade-off between speed and collision prevention. @@ -208,7 +208,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getLoadFactor, } ---- -Notice that we are also keeping track of collisions (for benchmarking purposes) and a load factor. *The load factor* measures how full the hash map is. We don’t want to be fuller than 75%. If the HashMap is getting too full, then we are going to fix it doing a *rehash* (more on that later). +Notice that we are also keeping track of collisions (for benchmarking purposes) and a load factor. *The load factor* measures how full the hash map is. We don’t want to be fuller than 75%. If the HashMap is getting too full, we will fix it doing a *rehash* (more on that later). ====== Inserting elements in a HashMap @@ -225,9 +225,9 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=set, indent=0] <1> Key doesn’t exist yet, so we create the new key/value pair. <2> Key already exists, then we will replace the value. <3> Key doesn’t exist, but the bucket already has other data, this is a collision! We push the new element to the bucket. -<4> To keep insertion order, we keep track of the order of the keys using `keysTrackerArray` and `keysTrackerIndex`. +<4> To keep insertion order, we keep track of the keys' order using `keysTrackerArray` and `keysTrackerIndex`. -Notice, that we are using a function called `getEntry` to check if the key already exists. It gets the index of the bucket corresponding to the key and then checks if the entry with the given key exists. We are going to implement this function in a bit. +Notice that we are using a function called `getEntry` to check if the key already exists. It gets the bucket's index corresponding to the access and then checks if the entry with the given key exists. We are going to implement this function in a bit. ====== Getting values out of a HashMap @@ -243,7 +243,7 @@ include::{codedir}/data-structures/maps/hash-maps/hash-map.js[tag=getEntry, inde <3> Use Linked list's <> method to find value on the bucket. <4> Return `bucket` and `entry` if found. -With the help of the `getEntry` method, we can do the `HashMap.get` and `HashMap.has` methods: +With the `getEntry` method, we can do the `HashMap.get` and `HashMap.has` methods: .HashMap's get method [source, javascript] @@ -277,7 +277,7 @@ method. ===== Rehashing a HashMap -Rehashing is a technique to minimize collisions when a hash map is getting full. It doubles the size of the map and recomputes all the hash codes and insert data in the new buckets. +Rehashing is a technique to minimize collisions when a hash map is getting full. It doubles the map's size and recomputes all the hash codes, and inserts data in the new buckets. When we increase the map size, we try to find the next prime. We explained that keeping the bucket size a prime number is beneficial for minimizing collisions. @@ -292,7 +292,7 @@ https://github.com/amejiarosario/dsa.js/blob/7694c20d13f6c53457ee24fbdfd3c0ac571 ===== HashMap time complexity -Hash Map it’s very optimal for searching values by key in constant time *O(1)*. However, searching by value is not any better than an array since we have to visit every value *O(n)*. +Hash Map is optimal for searching values by key in constant time *O(1)*. However, searching by value is not any better than an array since we have to visit every value *O(n)*. (((Tables, Non-Linear DS, HashMap complexities))) // tag::table[] @@ -307,4 +307,74 @@ Hash Map it’s very optimal for searching values by key in constant time *O(1)* // end::table[] indexterm:[Runtime, Linear] -As you can notice we have amortized times since, in the unfortunate case of a rehash, it will take O(n) while it resizes. After that, it will be *O(1)*. +As you can notice, we have amortized times since it will take O(n) while it resizes in the unfortunate case of a rehash. After that, it will be *O(1)*. + + +==== Practice Questions +(((Interview Questions, Hash Map))) + + + +// tag::hashmap-q-two-sum[] +===== Fit 2 movies in a flight + +*HM-1*) _You are working in an entertainment recommendation system for an airline. Given a flight duration (target) and an array of movies length, you need to recommend two movies that fit exactly the length of the flight. Return an array with the indices of the two numbers that add up to the target. No duplicates are allowed. If it's not possible to return empty `[]`._ + +// end::hashmap-q-two-sum[] + +// _Seen in interviews at: Amazon, Google, Apple._ + +Examples: + +[source, javascript] +---- +twoSum([113, 248, 80, 200, 91, 201, 68], 316); // [1, 6] (248 + 68 = 316) +twoSum([150, 100, 200], 300); // [2, 3] (100 + 200 = 300) +twoSum([150, 100, 200], 150); // [] (No two numbers add up to 150) +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/two-sum.js[tags=description;placeholder] +---- + + +_Solution: <>_ + + + + + +// tag::hashmap-q-subarray-sum-equals-k[] +===== Subarray Sum that Equals K + +*HM-2*) _Given an array of integers, find all the possible subarrays to add up to k. Return the count._ + +// end::hashmap-q-subarray-sum-equals-k[] + +// _Seen in interviews at: Facebook, Google, Amazon_ + +Examples: + +[source, javascript] +---- +subarraySum([1], 1); // 1 (1 equals to 1 :) +subarraySum([1, 1, 1], 1); // 3 ([1], [1], [1] equals 1) +subarraySum([1, -1, 1], 0); // 2 (sum([1, -1]), sum([-1, 1]) equals 0) +subaraySum([1, 2, 3, 0, 1, 4, 0, 5], 5) // 8 +// All of these 8 sub arrays add up to 5: +// [2, 30], [2,3,0], [0,1,4], [0,1,4,0], [1,4], [1,4,0], [0,5], [5] +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/subarray-sum-equals-k.js[tags=description;placeholder] +---- + + +_Solution: <>_ + diff --git a/book/interview-questions/longest-substring-without-repeating-characters.js b/book/interview-questions/longest-substring-without-repeating-characters.js new file mode 100644 index 00000000..3da6aac9 --- /dev/null +++ b/book/interview-questions/longest-substring-without-repeating-characters.js @@ -0,0 +1,14 @@ +// https://leetcode.com/problems/longest-substring-without-repeating-characters/submissions/ + +function lengthOfLongestSubstring(s: string): number { + let max = 0; + const set = new Set(); + + for (let i = 0, j = 0; j < s.length; j++) { + while (set.has(s[j])) set.delete(s[i++]); + set.add(s[j]); + max = Math.max(max, set.size); + } + + return max; +}; diff --git a/book/interview-questions/longest-substring-without-repeating-characters.spec.js b/book/interview-questions/longest-substring-without-repeating-characters.spec.js new file mode 100644 index 00000000..c56ff203 --- /dev/null +++ b/book/interview-questions/longest-substring-without-repeating-characters.spec.js @@ -0,0 +1,5 @@ +describe('', () => { + it('', () => { + + }); +}); diff --git a/book/interview-questions/subarray-sum-equals-k.js b/book/interview-questions/subarray-sum-equals-k.js new file mode 100644 index 00000000..42db8545 --- /dev/null +++ b/book/interview-questions/subarray-sum-equals-k.js @@ -0,0 +1,58 @@ +// tag::description[] +function subarraySum(nums, k) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + let ans = 0; + let sum = 0; + const map = new Map([[0, 1]]); + + for (let i = 0; i < nums.length; i++) { + sum += nums[i]; + if (map.has(sum - k)) ans += map.get(sum - k); + map.set(sum, 1 + (map.get(sum) || 0)); + } + + return ans; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::subarraySumBrute1[] +function subarraySumBrute1(nums, k) { + let ans = 0; + + for (let i = 0; i < nums.length; i++) { + for (let j = i; j < nums.length; j++) { + let sum = 0; + for (let n = i; n <= j; n++) { + sum += nums[n]; + } + if (sum === k) ans++; + } + } + + return ans; +} +// end::subarraySumBrute1[] + +// tag::subarraySumBrute2[] +function subarraySumBrute2(nums, k) { + let ans = 0; + + for (let i = 0; i < nums.length; i++) { + let sum = 0; + for (let j = i; j < nums.length; j++) { + sum += nums[j]; + if (sum === k) ans++; + } + } + + return ans; +} +// end::subarraySumBrute2[] + +module.exports = { subarraySum, subarraySumBrute1, subarraySumBrute2 }; diff --git a/book/interview-questions/subarray-sum-equals-k.spec.js b/book/interview-questions/subarray-sum-equals-k.spec.js new file mode 100644 index 00000000..c3670295 --- /dev/null +++ b/book/interview-questions/subarray-sum-equals-k.spec.js @@ -0,0 +1,24 @@ +const { subarraySum, subarraySumBrute1, subarraySumBrute2 } = require('./subarray-sum-equals-k'); +// const { } = require('../../src/index'); + +[subarraySum, subarraySumBrute1, subarraySumBrute2].forEach((fn) => { + describe(`HashMap: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = []; + const expected = 0; + expect(fn(actual, 0)).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [1, -1, 1]; + const expected = 3; + expect(fn(actual, 1)).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = [1, 2, 3, 0, 1, 4, 0, 5]; + const expected = 8; + expect(fn(actual, 5)).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/two-sum.js b/book/interview-questions/two-sum.js new file mode 100644 index 00000000..985585ec --- /dev/null +++ b/book/interview-questions/two-sum.js @@ -0,0 +1,34 @@ +// tag::description[] +function twoSum(nums, target) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const map = new Map(); + + for (let i = 0; i < nums.length; i++) { + const complement = target - nums[i]; + if (map.has(nums[i])) return [map.get(nums[i]), i]; + map.set(complement, i); + } + + return []; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::twoSumBrute[] +function twoSumBrute(nums, target) { + for (let i = 0; i < nums.length; i++) { + for (let j = i + 1; j < nums.length; j++) { + if (nums[i] + nums[j] === target) return [i, j]; + } + } + + return []; +} +// end::twoSumBrute[] + +module.exports = { twoSum, twoSumBrute }; diff --git a/book/interview-questions/two-sum.spec.js b/book/interview-questions/two-sum.spec.js new file mode 100644 index 00000000..7507ac18 --- /dev/null +++ b/book/interview-questions/two-sum.spec.js @@ -0,0 +1,28 @@ +const { twoSum } = require('./two-sum'); +// const { } = require('../../src/index'); + +describe('HashMap: Two Sum', () => { + it('should work with null/empty', () => { + const actual = []; + const expected = []; + expect(twoSum(actual, 0)).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [150, 100, 200]; + const expected = [1, 2]; + expect(twoSum(actual, 300)).toEqual(expected); + }); + + it('should work with small invalid case', () => { + const actual = [150, 100, 200]; + const expected = []; + expect(twoSum(actual, 150)).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = [113, 248, 80, 200, 91, 201, 68]; + const expected = [1, 6]; + expect(twoSum(actual, 316)).toEqual(expected); + }); +}); From 641b3388faa84f3757d2a6d20d9de26e3c9571cf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 3 Sep 2020 19:22:39 +0000 Subject: [PATCH 130/200] :bookmark: chore(release): 1.16.0 # [1.16.0](https://github.com/amejiarosario/dsa.js/compare/1.15.0...1.16.0) (2020-09-03) ### Features * **book/hashmap:** add exercises and solutions ([d18186b](https://github.com/amejiarosario/dsa.js/commit/d18186b61c260e3ae2cc1267cadd16c8cb453e00)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a05bd0..ce0a3855 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.16.0](https://github.com/amejiarosario/dsa.js/compare/1.15.0...1.16.0) (2020-09-03) + + +### Features + +* **book/hashmap:** add exercises and solutions ([d18186b](https://github.com/amejiarosario/dsa.js/commit/d18186b61c260e3ae2cc1267cadd16c8cb453e00)) + # [1.15.0](https://github.com/amejiarosario/dsa.js/compare/1.14.0...1.15.0) (2020-09-02) diff --git a/package-lock.json b/package-lock.json index 7ff12299..b3cde99f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.15.0", + "version": "1.16.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1abab67a..3b49557f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.15.0", + "version": "1.16.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From f40dc6314a14e1750146a19163b3b70c30f09d70 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 4 Sep 2020 09:13:16 -0400 Subject: [PATCH 131/200] feat(book/set): add questions and solutions --- book/D-interview-questions-solutions.asc | 88 +++++++++++---- book/content/part03/set.asc | 101 +++++++++++++++--- ...-substring-without-repeating-characters.js | 17 ++- ...tring-without-repeating-characters.spec.js | 23 +++- book/interview-questions/most-common-word.js | 51 +++++++++ .../most-common-word.spec.js | 41 +++++++ 6 files changed, 282 insertions(+), 39 deletions(-) create mode 100644 book/interview-questions/most-common-word.js create mode 100644 book/interview-questions/most-common-word.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 71e65e48..180a6222 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -577,35 +577,81 @@ The sum is 1, however `sum - k` is `0`. If it doesn't exist on the map, we will - Time: `O(n)`. We visit every number once. - Space: `O(n)`. The map size will be the same as the original array. -// :leveloffset: +1 -// === Solutions for TOPIC Questions -// (((Interview Questions Solutions, TOPIC))) -// :leveloffset: -1 +:leveloffset: +1 + +=== Solutions for Set Questions +(((Interview Questions Solutions, Set))) + +:leveloffset: -1 + + +[#set-q-most-common-word] +include::content/part03/set.asc[tag=set-q-most-common-word] + +This problem requires multiple steps. We can use a `Set` for quickly looking up banned words. For getting the count of each word, we used a `Map`. + +*Algorithm*: + +- Convert text to lowercase. +- Remove any special characters `!?',;.`. +- Convert the paragraph into words array. +- Count how many times words occur. +- Exclude banned words from counts. +- Return the word (or first one) that is the most repeated. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/most-common-word.js[tags=description;solution] +---- + +Here are heavily relying on Regular Expressions: + +- `\W+` would match all non-words. +- `\s+` catches all whitespace. + +The line that is mapping words to count seems very busy. Here's another version of the same code a little bit more explicit: + +[source, javascript] +---- +include::interview-questions/most-common-word.js[tags=explicit] +---- + +*Complexity Analysis*: + +- Time: `O(m + n)`, where `n` is paragraph length and `m` is the number of banned words. If we were NOT using a `Set` for prohibited words, then the runtime would have been `O(mn)`. +- Space: `O(m + n)`. The extra space complexity is given by the size of the `Map` and `Set`. + -// [#TOPIC-q-FILENAME] -// include::content/part03/TOPIC_FILE.asc[tag=TOPIC-q-FILENAME] -// RESTATE REQUIREMENTS AND DESCRIPTIONS -// *Algorithm*: -// - STEP 1 -// - STEP 2 -// - STEP 2.1 -// - STEP 2.2 +[#set-q-longest-substring-without-repeating-characters] +include::content/part03/set.asc[tag=set-q-longest-substring-without-repeating-characters] -// *Implementation*: +One of the most efficient ways to find repeating characters is using a `Map` or `Set`. Use a `Map` when you need to keep track of the count/index (e.g., string -> count) and use a `Set` when you only need to know if there are repeated characters or not. -// [source, javascript] -// ---- -// include::interview-questions/FILENAME.js[tags=description;solution] -// ---- +*Algorithm*: + +* Visit each letter. +** Insert the letter on a Set. +** Keep track of the maximum size of the Set in `max`. +** If the letter has been seen before, delete until there's no duplicate. +* Return max. -// IMPLEMENTATION NOTES +*Implementation*: -// *Complexity Analysis*: +[source, javascript] +---- +include::interview-questions/longest-substring-without-repeating-characters.js[tags=description;solution] +---- + +We could also have used a Map and keep track of the indexes, but that's not necessary. In this case, the `Set` is all we need. + +*Complexity Analysis*: -// - Time: `O(?)`. WHY? -// - Space: `O(?)`. WHY? +- Time: `O(n)`. We visit each letter once. +- Space: `O(W)`, where `W` is the max length of non-repeating characters. The maximum size of the Set gives the space complexity. In the worst-case scenario, all letters are unique (`W = n`), so our space complexity would be `O(n)`. In the avg. case where there are one or more duplicates, it uses less space than `n`, because `W < n`. diff --git a/book/content/part03/set.asc b/book/content/part03/set.asc index 4f02fa61..7b64690e 100644 --- a/book/content/part03/set.asc +++ b/book/content/part03/set.asc @@ -7,9 +7,9 @@ endif::[] === Set (((Set))) (((Data Structures, Non-Linear, Set))) -A set is a data structure where duplicated entries are not allowed. Set is like an array with unique values. +A set is a data structure where duplicated entries are not allowed. A Set is like an array with only unique values. -NOTE: JavaScript has already a built-in Set data structure. +NOTE: JavaScript already has a built-in Set data structure. Take a look at the following example: @@ -38,15 +38,15 @@ TIP: A hint... it should perform all operations in *O(1)** or at most *O(log n)* If we use a `map`, we can accomplish this. However, maps use a key/value pair. If we only use the keys, we can avoid duplicates. Since in a `map` you can only have one key at a time. -As you might remember from the <> chapter, there are two ways of implementing a `map` and both can be used to create a `set`. Let's explore the difference between the two implementations are. +As you might remember from the <> chapter, there are two ways of implementing a `map`, and both can be used to create a `set`. Let's explore the difference between the two implementations are. ==== HashSet vs TreeSet -We can implement a `map` using a *balanced BST* and using a *hash function*. If we use them to implement a `Set`, then we would have a `HashSet` and `TreeSet` respectively. +We can implement a `map` using a *balanced BST* or a *hash function*. If we use them to implement a `Set`, we would have a `HashSet` and `TreeSet`. * `TreeSet`, would return the values sorted in ascending order. * `HashSet`, would return the values in insertion order. -* Operations on a `HashSet` would take on average O(1) and in the worst case (rehash is due), it would take O(n). +* Operations on a `HashSet` would take on average O(1), and in the worst case (rehash is due), it would take O(n). * Operation on a `TreeSet` is always O(log n). Let’s implement both! @@ -65,7 +65,7 @@ include::{codedir}/data-structures/sets/tree-set.js[tag=constructor] ---- <1> Converts an array or any iterable data structure to a set. -A common use case for Sets is to remove duplicated values from an array. We can do that by passing them in the constructor as follows: +An everyday use case for Sets is to remove duplicated values from an array. We can do that bypassing them in the constructor as follows: .Removing duplicates from an Array using a Set [source, javascript] @@ -115,7 +115,7 @@ Voilà! That’s it! ===== Converting TreeSet to Array -A common use case for a Set is to convert it to an array or use in an iterator (for loops, forEach, …). Let’s provide the method for that: +Another use case for a Set is to convert it to an array or use an iterator (for loops, forEach, …). Let’s provide the method for that: .TreeSet's iterator [source, javascript] @@ -151,7 +151,7 @@ No more duplicates in our array! Check out our https://github.com/amejiarosario/dsa.js/blob/f69b744a1bddd3d99243ca64b3ad46f3f2dd7342/src/data-structures/sets/tree-set.js#L12[GitHub repo for the full TreeSet implementation]. -Let’s now, implement a `HashSet`. +Let’s now implement a `HashSet`. [[hashset]] ==== HashSet @@ -172,7 +172,7 @@ This constructor is useful for converting an array to set and initializing the ` ===== Inserting values to a HashSet -To insert items in a HashSet we use the `set` method of the `HashMap`: +To insert items in a HashSet, we use the `set` method of the `HashMap`: .HashSet's `add` method [source, javascript] @@ -181,7 +181,7 @@ include::{codedir}/data-structures/sets/hash-set.js[tag=add, indent=0] } ---- -`HashMap` stores key/value pairs, but for this, we only need the key, and we ignore the value. +`HashMap` stores key/value pairs, but we only need the keys for Set, so we ignore the value. ===== Finding values in a HashSet @@ -198,7 +198,7 @@ true, and if it’s empty, it will be false. ===== Deleting values from a HashSet -For deleting a value from a hashSet we use the HashMap’s delete method: +For deleting a value from a hashSet, we use the HashMap’s delete method: .HashSet's `delete` method [source, javascript] @@ -210,7 +210,7 @@ This method has an average runtime of *O(1)*. ==== HashSet vs HashMap Time Complexity -We can say that `HashMap` in on average more performant O(1) vs. O(log n). However, if a +We can say that `HashMap` in on average, more performant O(1) vs. O(log n). However, if a rehash happens, it will take *O(n)* instead of *O(1)*. A `TreeSet` is always *O(log n)*. (((Tables, Non-Linear DS, HashSet/TreeSet complexities))) @@ -236,3 +236,80 @@ difference besides runtime is that: .TreeSet vs HashSet * HashSet keeps data in insertion order * TreeSet keeps data sorted in ascending order. + + +==== Practice Questions +(((Interview Questions, Set))) + +// tag::set-q-most-common-word[] +===== Most common word + +*ST-1*) _Given a text and a list of banned words. +Find the most common word that is not on the banned list. +You might need to sanitize the text and strip out punctuation `?!,'.`_ +// end::set-q-most-common-word[] + +// _Seen in interviews at: Amazon._ + +Examples: + +[source, javascript] +---- +mostCommonWord( + `How much wood, would a Woodchuck chuck, + if a woodchuck could chuck?`, + ['a'], +); // woodchuck or chuck (both show up twice) + +mostCommonWord( +`It's a blue ball and its shade... Very BLUE!`, +['and']); // blue (it show up twice, "it" and "its" once) +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/most-common-word.js[tags=description;placeholder] +---- + + +_Solution: <>_ + + + + + + + + + + + +// tag::set-q-longest-substring-without-repeating-characters[] +===== Longest Without Repeating + +*ST-2*) _Find the length of the longest substring without repeating characters._ + +// end::set-q-longest-substring-without-repeating-characters[] + +// _Seen in interviews at: Amazon, Facebook, Bloomberg._ + +Examples: + +[source, javascript] +---- +lenLongestSubstring('aaaaa'); // 1 ('a') +lenLongestSubstring('abccdefg'); // 5 ('cdefg') +lenLongestSubstring('abc'); // 3 ('abc') +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/longest-substring-without-repeating-characters.js[tags=description;placeholder] +---- + + +_Solution: <>_ diff --git a/book/interview-questions/longest-substring-without-repeating-characters.js b/book/interview-questions/longest-substring-without-repeating-characters.js index 3da6aac9..5dd0cd38 100644 --- a/book/interview-questions/longest-substring-without-repeating-characters.js +++ b/book/interview-questions/longest-substring-without-repeating-characters.js @@ -1,6 +1,10 @@ -// https://leetcode.com/problems/longest-substring-without-repeating-characters/submissions/ - -function lengthOfLongestSubstring(s: string): number { +// tag::description[] +function lenLongestSubstring(s) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] let max = 0; const set = new Set(); @@ -11,4 +15,9 @@ function lengthOfLongestSubstring(s: string): number { } return max; -}; + // end::solution[] + // tag::description[] +} +// end::description[] + +module.exports = { lenLongestSubstring }; diff --git a/book/interview-questions/longest-substring-without-repeating-characters.spec.js b/book/interview-questions/longest-substring-without-repeating-characters.spec.js index c56ff203..7011e0d4 100644 --- a/book/interview-questions/longest-substring-without-repeating-characters.spec.js +++ b/book/interview-questions/longest-substring-without-repeating-characters.spec.js @@ -1,5 +1,24 @@ -describe('', () => { - it('', () => { +const { lenLongestSubstring } = require('./longest-substring-without-repeating-characters'); +// const { } = require('../../src/index'); +[lenLongestSubstring].forEach((fn) => { + describe(`Set: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = ''; + const expected = 0; + expect(fn(actual)).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = 'abc'; + const expected = 3; + expect(fn(actual)).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = 'abccdefg'; + const expected = 5; + expect(fn(actual)).toEqual(expected); + }); }); }); diff --git a/book/interview-questions/most-common-word.js b/book/interview-questions/most-common-word.js new file mode 100644 index 00000000..c74abac1 --- /dev/null +++ b/book/interview-questions/most-common-word.js @@ -0,0 +1,51 @@ +// tag::description[] +/** + * Find the most common word that is not banned. + * + * @param {string} paragraph - The text to sanitize and search on. + * @param {string[]} banned - List of banned words (lowercase) + */ +function mostCommonWord(paragraph, banned) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const words = paragraph.toLowerCase().replace(/\W+/g, ' ').split(/\s+/); + const b = new Set(banned); + const map = words.reduce((m, w) => (b.has(w) ? m : m.set(w, 1 + (m.get(w) || 0))), new Map()); + const max = Math.max(...map.values()); + for (const [w, c] of map.entries()) if (c === max) return w; + return ''; + // end::solution[] + // tag::description[] +} +// end::description[] + + +// tag::explicit[] +function mostCommonWordExplicit(paragraph, banned) { + const words = paragraph + .toLowerCase() + .replace(/\W+/g, ' ') + .split(/\s+/); + const exclude = new Set(banned); + + const wordsCount = words.reduce((map, word) => { + if (exclude.has(word)) return map; + const count = map.get(word) || 0; + return map.set(word, 1 + count); + }, new Map()); + + const max = Math.max(...wordsCount.values()); + + for (const [word, count] of wordsCount.entries()) { + if (count === max) { + return word; + } + } + return ''; +} +// end::explicit[] + +module.exports = { mostCommonWord, mostCommonWordExplicit }; diff --git a/book/interview-questions/most-common-word.spec.js b/book/interview-questions/most-common-word.spec.js new file mode 100644 index 00000000..a0a501de --- /dev/null +++ b/book/interview-questions/most-common-word.spec.js @@ -0,0 +1,41 @@ +const { mostCommonWord, mostCommonWordExplicit } = require('./most-common-word'); +// const { } = require('../../src/index'); + +[mostCommonWord, mostCommonWordExplicit].forEach((fn) => { + describe(`Set: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = ''; + const expected = ''; + expect(fn(actual, [])).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = 'a'; + const expected = ''; + expect(fn(actual, ['a'])).toEqual(expected); + }); + + it('should work with small case 2', () => { + const actual = 'a'; + const expected = 'a'; + expect(fn(actual, ['b'])).toEqual(expected); + }); + + it('should work with other case', () => { + expect(fn( + `How much wood, would a Woodchuck chuck, + if a woodchuck could chuck?`, + ['a'], + )).toEqual({ + asymmetricMatch: (actual) => ['woodchuck', 'chuck'].includes(actual), + }); + }); + + it('should work with \' case', () => { + expect(fn( + 'It\'s a blue ball and its shade... Very BLUE!', + ['and'], + )).toEqual('blue'); + }); + }); +}); From 75aa67a1adad6f2dbb1e51742527962221065134 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 4 Sep 2020 10:02:45 -0400 Subject: [PATCH 132/200] chore(book/questions): improve function documentation --- book/interview-questions/binary-tree-right-side-view.js | 2 +- book/interview-questions/buy-sell-stock.js | 1 + book/interview-questions/daily-temperatures.js | 1 + book/interview-questions/linkedlist-same-data.js | 5 +++-- .../longest-substring-without-repeating-characters.js | 6 ++++++ book/interview-questions/max-subarray.js | 1 + book/interview-questions/merge-lists.js | 1 + book/interview-questions/most-common-word.js | 3 ++- book/interview-questions/recent-counter.js | 4 ++-- book/interview-questions/subarray-sum-equals-k.js | 7 +++++++ book/interview-questions/two-sum.js | 8 ++++++++ book/interview-questions/valid-parentheses.js | 3 ++- 12 files changed, 35 insertions(+), 7 deletions(-) diff --git a/book/interview-questions/binary-tree-right-side-view.js b/book/interview-questions/binary-tree-right-side-view.js index 52b8c3e2..2e489077 100644 --- a/book/interview-questions/binary-tree-right-side-view.js +++ b/book/interview-questions/binary-tree-right-side-view.js @@ -4,7 +4,7 @@ const { Queue } = require('../../src/index'); /** * Find the rightmost nodes by level. * - * @example + * @example rightSideView(bt([1,2,3,4])); // [1, 3, 4] * 1 <- 1 * / \ * 2 3 <- 3 diff --git a/book/interview-questions/buy-sell-stock.js b/book/interview-questions/buy-sell-stock.js index 47422ff0..b12c11d4 100644 --- a/book/interview-questions/buy-sell-stock.js +++ b/book/interview-questions/buy-sell-stock.js @@ -6,6 +6,7 @@ * maxProfit([1, 2, 3]); // => 2 * maxProfit([3, 2, 1]); // => 0 * @param {number[]} prices - Array with daily stock prices + * @returns {number} - Max profit */ function maxProfit(prices) { // end::description[] diff --git a/book/interview-questions/daily-temperatures.js b/book/interview-questions/daily-temperatures.js index c46cf702..82f01cf5 100644 --- a/book/interview-questions/daily-temperatures.js +++ b/book/interview-questions/daily-temperatures.js @@ -9,6 +9,7 @@ * dailyTemperatures([73, 69, 72, 76, 73]); // [3, 1, 1, 0, 0] * * @param {number[]} t - Daily temperatures + * @returns {number[]} - Array with count of days to warmer temp. */ function dailyTemperatures(t) { // end::description[] diff --git a/book/interview-questions/linkedlist-same-data.js b/book/interview-questions/linkedlist-same-data.js index fd303d36..ca99badc 100644 --- a/book/interview-questions/linkedlist-same-data.js +++ b/book/interview-questions/linkedlist-same-data.js @@ -9,8 +9,9 @@ * hasSameData(['he', 'll', 'o'], ['hel', 'lo']); // true * hasSameData(['hel', 'lo'], ['hi']); // false * - * @param {ListNode} l1 - The root node of list 1 - * @param {ListNode} l2 - The root node of list 2 + * @param {ListNode} l1 - The root node of list 1. + * @param {ListNode} l2 - The root node of list 2. + * @returns {boolean} - true if has same data, false otherwise. */ function hasSameData(l1, l2) { // end::description[] diff --git a/book/interview-questions/longest-substring-without-repeating-characters.js b/book/interview-questions/longest-substring-without-repeating-characters.js index 5dd0cd38..3c3606a6 100644 --- a/book/interview-questions/longest-substring-without-repeating-characters.js +++ b/book/interview-questions/longest-substring-without-repeating-characters.js @@ -1,4 +1,10 @@ // tag::description[] +/** + * Find the length of the longest substring without duplicates. + * @example lenLongestSubstring('abccxyz'); // => 4 (cxyz) + * @param {string} s - The string. + * @returns {number} - The length of the longest unique substring. + */ function lenLongestSubstring(s) { // end::description[] // tag::placeholder[] diff --git a/book/interview-questions/max-subarray.js b/book/interview-questions/max-subarray.js index a1217635..6fb62d5d 100644 --- a/book/interview-questions/max-subarray.js +++ b/book/interview-questions/max-subarray.js @@ -7,6 +7,7 @@ * maxSubArray([-3,4,-1,2,1,-5]); // => 6 * * @param {number[]} a - Array + * @returns {number} - max sum */ function maxSubArray(a) { // end::description[] diff --git a/book/interview-questions/merge-lists.js b/book/interview-questions/merge-lists.js index ad26c326..b50f7f33 100644 --- a/book/interview-questions/merge-lists.js +++ b/book/interview-questions/merge-lists.js @@ -9,6 +9,7 @@ const ListNode = require('../../src/data-structures/linked-lists/node'); * * @param {ListNode} l1 - The root node of list 1 * @param {ListNode} l2 - The root node of list 2 + * @returns {ListNode} - The root of the merged list. */ function mergeTwoLists(l1, l2) { // end::description[] diff --git a/book/interview-questions/most-common-word.js b/book/interview-questions/most-common-word.js index c74abac1..b2c3f58f 100644 --- a/book/interview-questions/most-common-word.js +++ b/book/interview-questions/most-common-word.js @@ -1,9 +1,10 @@ // tag::description[] /** * Find the most common word that is not banned. - * + * @example mostCommonWord("It's blue and it's round", ['and']) // it * @param {string} paragraph - The text to sanitize and search on. * @param {string[]} banned - List of banned words (lowercase) + * @returns {string} - The first word that is the most repeated. */ function mostCommonWord(paragraph, banned) { // end::description[] diff --git a/book/interview-questions/recent-counter.js b/book/interview-questions/recent-counter.js index 052e27f6..79eada7c 100644 --- a/book/interview-questions/recent-counter.js +++ b/book/interview-questions/recent-counter.js @@ -5,8 +5,8 @@ const { Queue } = require('../../src/index'); * Counts the most recent requests within a time window. * Each request has its timestamp. * If the time window is 2 seconds, - * any requests that happened more than 2 seconds before the most recent request - * should not count. + * any requests that happened more than 2 seconds before the most + * recent request should not count. * * @example - The time window is 3 sec. (3000 ms) * const counter = new RecentCounter(3000); diff --git a/book/interview-questions/subarray-sum-equals-k.js b/book/interview-questions/subarray-sum-equals-k.js index 42db8545..61aa74f0 100644 --- a/book/interview-questions/subarray-sum-equals-k.js +++ b/book/interview-questions/subarray-sum-equals-k.js @@ -1,4 +1,11 @@ // tag::description[] +/** + * Find the number of subarrays that add up to k. + * @example subarraySum([1, -1, 1], 0); // 3 ([1,-1,1], [1], [1]) + * @param {number[]} nums - Array of integers. + * @param {number} k - The target sum. + * @returns {number} - The number of solutions. + */ function subarraySum(nums, k) { // end::description[] // tag::placeholder[] diff --git a/book/interview-questions/two-sum.js b/book/interview-questions/two-sum.js index 985585ec..37d75204 100644 --- a/book/interview-questions/two-sum.js +++ b/book/interview-questions/two-sum.js @@ -1,4 +1,12 @@ // tag::description[] +/** + * Find two numbers that add up to the target value. + * Return empty array if not found. + * @example twoSum([19, 7, 3], 10) // => [1, 2] + * @param {number[]} nums - Array of integers + * @param {number} target - The target sum. + * @returns {[number, number]} - Array with index 1 and index 2 + */ function twoSum(nums, target) { // end::description[] // tag::placeholder[] diff --git a/book/interview-questions/valid-parentheses.js b/book/interview-questions/valid-parentheses.js index a822a214..2e097cc0 100644 --- a/book/interview-questions/valid-parentheses.js +++ b/book/interview-questions/valid-parentheses.js @@ -2,12 +2,13 @@ /** * Validate if the parentheses are opened and closed in the right order. * - * @example + * @examples * isParenthesesValid('(){}[]'); // true * isParenthesesValid('([{}])'); // true * isParenthesesValid('([{)}]'); // false * * @param {string} string - The string + * @returns {boolean} - True if valid, false otherwise. */ function isParenthesesValid(string) { // end::description[] From 8a92ba0d1c97be70e7a72608a0fab0ae4b8b5d60 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 4 Sep 2020 14:23:01 +0000 Subject: [PATCH 133/200] :bookmark: chore(release): 1.17.0 # [1.17.0](https://github.com/amejiarosario/dsa.js/compare/1.16.0...1.17.0) (2020-09-04) ### Features * **book/set:** add questions and solutions ([f40dc63](https://github.com/amejiarosario/dsa.js/commit/f40dc6314a14e1750146a19163b3b70c30f09d70)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce0a3855..4bd0eb14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.17.0](https://github.com/amejiarosario/dsa.js/compare/1.16.0...1.17.0) (2020-09-04) + + +### Features + +* **book/set:** add questions and solutions ([f40dc63](https://github.com/amejiarosario/dsa.js/commit/f40dc6314a14e1750146a19163b3b70c30f09d70)) + # [1.16.0](https://github.com/amejiarosario/dsa.js/compare/1.15.0...1.16.0) (2020-09-03) diff --git a/package-lock.json b/package-lock.json index b3cde99f..7d5d9509 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.16.0", + "version": "1.17.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3b49557f..feaa51db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.16.0", + "version": "1.17.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 5 Sep 2020 08:47:59 -0400 Subject: [PATCH 134/200] feat(book/graph): add schedule exercise and solution --- book/D-interview-questions-solutions.asc | 191 ++++++++++++++++++ book/content/part03/graph-search.asc | 143 ++++++++++++- book/images/course-schedule-examples.png | Bin 0 -> 22504 bytes .../critical-connections-sol-examples.png | Bin 0 -> 35639 bytes book/images/critical-path-examples.png | Bin 0 -> 40870 bytes book/interview-questions/course-schedule.js | 61 ++++++ .../course-schedule.spec.js | 54 +++++ .../critical-connections-in-a-network.js | 76 +++++++ .../critical-connections-in-a-network.spec.js | 37 ++++ .../interview-questions/network-delay-time.js | 28 +++ .../network-delay-time.spec.js | 5 + 11 files changed, 587 insertions(+), 8 deletions(-) create mode 100644 book/images/course-schedule-examples.png create mode 100644 book/images/critical-connections-sol-examples.png create mode 100644 book/images/critical-path-examples.png create mode 100644 book/interview-questions/course-schedule.js create mode 100644 book/interview-questions/course-schedule.spec.js create mode 100644 book/interview-questions/critical-connections-in-a-network.js create mode 100644 book/interview-questions/critical-connections-in-a-network.spec.js create mode 100644 book/interview-questions/network-delay-time.js create mode 100644 book/interview-questions/network-delay-time.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 180a6222..d7228268 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -655,3 +655,194 @@ We could also have used a Map and keep track of the indexes, but that's not nece - Time: `O(n)`. We visit each letter once. - Space: `O(W)`, where `W` is the max length of non-repeating characters. The maximum size of the Set gives the space complexity. In the worst-case scenario, all letters are unique (`W = n`), so our space complexity would be `O(n)`. In the avg. case where there are one or more duplicates, it uses less space than `n`, because `W < n`. + + + + + + + +:leveloffset: +1 + +=== Solutions for Graph Questions +(((Interview Questions Solutions, Graph))) + +:leveloffset: -1 + + +[#graph-q-course-schedule] +include::content/part03/graph-search.asc[tag=graph-q-course-schedule] + +Basically, we have to detect if the graph has a cycle or not. +There are multiple ways to detect cycles on a graph using BFS and DFS. + +One of the most straightforward ways to do it is using DFS one each course (node) and traverse their prerequisites (neighbors). If we start in a node, and then we see that node again, we found a cycle! (maybe) + +A critical part of solving this exercise is coming up with good test cases. Let's examine these two: + +[graphviz, course-schedule-examples, png] +.... +digraph G { + subgraph cluster_1 { + a0 -> a1 -> a2 + a0 -> a2 [color=gray] + label = "Example A" + } + + subgraph cluster_2 { + b0 -> b1 -> b2 -> b3 + b3 -> b1 [color=red] + label = "Example B"; + } +} +.... + +Let's say we are using a regular DFS, where we visit the nodes and keep track of visited nodes. If we test the example A, we can get to the course 2 (a2) in two ways. So, we can't blindly assume that "seen" nodes are because of a cycle. To solve this issue, we can keep track of the parent. + +For example B, if we start in course 0 (b0), we can find a cycle. However, the cycle does not involve course 0 (parent). When we visit course 1 (b1) and mark it as the parent, we will see that reach to course 1 (b1) again. Then, we found a cycle! + +[source, javascript] +---- +include::interview-questions/course-schedule.js[tags=brute1] +---- + +We built the graph on the fly as an adjacency list (Map + Arrays). +Then we visited each node, checking if there it has cycles. If none has cyles, then we return true. + +The cycle check uses DFS. We keep track of seen nodes and also who the parent is. If we get to the parent more than once, we have a cycle like examples A and B. + +What's the time complexity? + +We visite every node/vertex: `O(|V|)` and then for every node, we visite all it's edges, so we have `O(|V|*|E|)`. + +Can we do better? + +There's no need to visit nodes more than once. Instead of having a local `seen` variable for each node, we can move it outside the loop. However, it won't be a boolean anymore (seen or not seen). We could see nodes more than once, without being in a cycle (example A). One idea is to have 3 states: `unvisited` (0), `visiting` (1) and `visited` (2). Let's devise the algorithm: + +*Algorithm*: + +* Build a graph as an adjacency list (map + arrays). +* Fill in every prerequisite as an edge on the graph. +* Visit every node and if there's a cycle, return false. +** When we start visiting a node, we mark it as 1 (visiting) +** Visit all its adjacent nodes +** Mark current node as 2 (visited) when we finish visiting neighbors. +** If we see a node in visiting state more than once, it's a cycle! +** If we see a node in a visited state, skip it. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/course-schedule.js[tags=description;solution] +---- + +In the first line, we initialize the map with the course index and an empty array. +This time the `seen` array is outside the recursion. + +*Complexity Analysis*: + +- Time: `O(|V| + |E|)`. We go through each node and edge only once. +- Space: `O(|V| + |E|)`. The size of the adjacency list. + + + + +// +[#graph-q-critical-connections-in-a-network] +include::content/part03/graph-search.asc[tag=graph-q-critical-connections-in-a-network] + +On idea to find if a path is critical is to remove it. If we visit the graph and see that some nodes are not reachable, then, oops, It was critical! + +We can code precisely that. We can remove one link at a time and check if all other nodes are reachable. It's not very efficient, but it's a start. + +[source, javascript] +---- +include::interview-questions/critical-connections-in-a-network.js[tags=criticalConnectionsBrute1] +---- + +We are using a function `areAllNodesReachable`, which implements a BFS for visiting the graph, but DFS would have worked too. The runtime is `O(|E| + |V|)`, where `E` is the number of edges and `V` the number of nodes/servers. In `criticalConnectionsBrute1`, We are looping through all `connections` (`E`) to remove one connection at a time and then checking if all servers are still reachable with `areAllNodesReachable`. + +The time complexity is `O(|E|^2 * |V|)`. Can we do it on one pass? Sure we can! + +*Tarjan's Strongly Connected Components Algorithms* + +A connection is critical only if it's not part of the cycle. + +In other words, a critical path is like a bridge that connects islands; if you remove it you won't cross from one island to the other. + +Connections that are part of the cycle (blue) have redundancy. If you eliminate one, you can still reach other nodes. Check out the examples below. + +[graphviz, critical-connections-sol-examples, png] +.... +graph G { + subgraph cluster_0 { + a0 -- a1 [color=blue] + a1 -- a2 [color=blue] + a2 -- a0 [color=blue] + a1 -- a3 [color=blue] + a3 -- a2 [color=blue] + label = "Example A"; + } + + subgraph cluster_3 { + b0 -- b1 [color=blue] + b1 -- b2 [color=blue] + b2 -- b0 [color=blue] + b1 -- b3 [color=red] + b3 -- b2 [color=transparent] // removed + label = "Example B"; + } + + subgraph cluster_1 { + c0 -- c1 -- c2 -- c3 [color=red] + label = "Example C"; + } +} +.... + +The red connections are critical; if we remove any, some servers won't be reachable. + +We can solve this problem in one pass using DFS. But for that, we keep track of the nodes that are part of a loop (strongly connected components). To do that, we use the time of visit (or depth in the recursion) each node. + +For example C, if we start on `c0`, it belongs to group 0, then we move c1, c2, and c3, increasing the depth counter. Each one will be on its own group since there's no loop. + +For example B, we can start at `b0`, and then we move to `b1` and `b2`. However, `b2` circles back to `b0`, which is on group 0. We can update the group of `b1` and `b2` to be 0 since they are all connected in a loop. + +For an *undirected graph*, If we found a node on our dfs, that we have previously visited, we found a loop! We can mark all of them with the lowest group number. We know we have a critical path when it's a connection that links two different groups. For example A, they all will belong to group 0, since they are all in a loop. For Example B, we will have `b0`, `b1`, and `b2` on the same group while `b3` will be on a different group. + +*Algorithm*: + +* Build the graph as an adjacency list (map + array) +* Run dfs on any node. E.g. `0`. +** Keep track of the nodes that you have seen using `group` array. But instead of marking them as seen or not. Let's mark it with the `depth`. +** Visit all the adjacent nodes that are NOT the parent. +** If we see a node that we have visited yet, do a dfs on it and increase the depth. +** If the adjacent node has a lower grouping number, update the current node with it. +** If the adjacent node has a higher grouping number, then we found a critical path. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/critical-connections-in-a-network.js[tags=description;solution] +---- + +This algorithm only works with DFS. + +*Complexity Analysis*: + +- Time: `O(|E| + |V|)`. We visit each node and edge only once. +- Space: `O(|E| + |V|)`. The graph has all the edges and nodes. Additionally, we use the `group` variable with a size of `|V|`. + + + + + + + +// + + + + diff --git a/book/content/part03/graph-search.asc b/book/content/part03/graph-search.asc index 48bf5308..08356768 100644 --- a/book/content/part03/graph-search.asc +++ b/book/content/part03/graph-search.asc @@ -7,9 +7,9 @@ endif::[] Graph search allows you to visit search elements. -WARNING: Graph search is very similar to <>. So, if you read that sections some of the concepts here will be familiar to you. +WARNING: Graph search is very similar to <>. So, if you read that section, some of the concepts here will be familiar to you. -There are two ways to navigate the graph, one is using Depth-First Search (DFS) and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. +There are two ways to navigate the graph, one is using Depth-First Search (DFS), and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. image::directed-graph.png[directed graph] @@ -44,10 +44,10 @@ image::directed-graph.png[directed graph] ==== Depth-First Search for Graphs -With Depth-First Search (DFS) we go deep before going wide. +With Depth-First Search (DFS), we go deep before going wide. Let's say that we use DFS on the graph shown above, starting with node `0`. -A DFS, will probably visit 5, then visit `1` and continue going down `3` and `2`. As you can see, we need to keep track of visited nodes, since in graphs we can have cycles like `1-3-2`. +A DFS will probably visit 5, then visit `1` and continue going down `3` and `2`. As you can see, we need to keep track of visited nodes, since in graphs, we can have cycles like `1-3-2`. Finally, we back up to the remaining node `0` children: node `4`. So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. @@ -56,13 +56,13 @@ So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. ==== Breadth-First Search for Graphs -With Breadth-First Search (BFS) we go wide before going deep. +With Breadth-First Search (BFS), we go wide before going deep. // TODO: BFS traversal Let's say that we use BFS on the graph shown above, starting with the same node `0`. -A BFS, will visit 5 as well, then visit `1` and will not go down to it's children. +A BFS will visit 5 as well, then visit `1` and not go down to its children. It will first finish all the children of node `0`, so it will visit node `4`. -After all the children of node `0` are visited it continue with all the children of node `5`, `1` and `4`. +After all the children of node `0` are visited, it will continue with all the children of node `5`, `1`, and `4`. In summary, BFS would visit the graph: `[0, 5, 1, 4, 3, 2]` @@ -86,4 +86,131 @@ You might wonder what the difference between search algorithms in a tree and a g The difference between searching a tree and a graph is that the tree always has a starting point (root node). However, in a graph, you can start searching anywhere. There's no root. -NOTE: Every tree is a graph, but not every graph is a tree. +NOTE: Every tree is a graph, but not every graph is a tree. Only acyclic directed graphs (DAG) are trees. + + +==== Practice Questions +(((Interview Questions, graph))) + + + + +// tag::graph-q-course-schedule[] +===== Course Schedule + +*gr-1*) _Check if it's possible to take a number of courses while satisfying their prerequisites._ + +// end::graph-q-course-schedule[] + +// _Seen in interviews at: Amazon, Facebook, Bytedance (TikTok)._ + + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/course-schedule.js[tags=description;placeholder] +---- + + +*Examples*: + +[source, javascript] +---- +canFinish(2, [[1, 0]]); // true +// 2 courses: 0 and 1. One prerequisite: 0 -> 1 +// To take course 1 you need to take course 0. +// Course 0 has no prerequisite, so you can take 0 and then 1. + +canFinish(2, [[1, 0], [0, 1]]); // false +// 2 courses: 0 and 1. Two prerequisites: 0 -> 1 and 1 -> 0. +// To take course 1, you need to take course 0. +// To Course 0, you need course 1, so you can't any take them! + +canFinish(3, [[2, 0], [1, 0], [2, 1]]); // true +// 3 courses: 0, 1, 2. Three prerequisites: 0 -> 2 and 0 -> 1 -> 2 +// To take course 2 you need course 0, course 0 has no prerequisite. +// So you can take course 0 first, then course 1, and finally course 2. + +canFinish(4, [[1, 0], [2, 1], [3, 2], [1, 3]]); // false +// 4 courses: 0, 1, 2, 3. Prerequisites: 0 -> 1 -> 2 -> 3 and 3 -> 1. +// You can take course 0 first since it has no prerequisite. +// For taking course 1, you need course 3. However, for taking course 3 +// you need 2 and 1. You can't finish then! +---- + + +_Solution: <>_ + + + + + + + +// tag::graph-q-critical-connections-in-a-network[] +===== Critical Network Paths + +*gr-2*) _Given `n` servers and the connections between them, return the critical paths._ + +// end::graph-q-critical-connections-in-a-network[] + +// _Seen in interviews at: Amazon, Google._ + +Examples: + +[graphviz, critical-path-examples, png] +.... +graph G { + subgraph cluster_1 { + a0 -- a1 -- a2 [color=firebrick1] + label = "Example A"; + } + + subgraph cluster_0 { + b0 -- b1 [color=blue] + b1 -- b2 [color=blue] + b2 -- b0 [color=blue] + b1 -- b3 [color=blue] + b3 -- b2 [color=blue] + label = "Example B"; + b0, b1, b2, b3 [color=midnightblue] + } + + subgraph cluster_3 { + c0 -- c1 [color=blue] + c1 -- c2 [color=blue] + c2 -- c0 [color=blue] + c1 -- c3 [color=firebrick1] + c3 -- c2 [color=transparent] // removed + label = "Example C"; + c0, c1, c2 [color=midnightblue] + // c3 [color=red] + } +} +.... + +[source, javascript] +---- +// Example A +criticalConnections(3, [[0, 1], [1, 2]]);// [[0, 1], [1, 2]] +// if you remove any link, there will be stranded servers. + +// Example B +criticalConnections(4, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 2]]);// [] +// you can remove any connection and all servers will be reachable. + +// Example C +criticalConnections(4, [[0, 1], [1, 2], [2, 0], [1, 3]]); // [[1, 3]] +// if you remove [1, 3], then server 3 won't be reachable. +// If you remove any other link. It will be fine. +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/critical-connections-in-a-network.js[tags=description;placeholder] +---- + +_Solution: <>_ diff --git a/book/images/course-schedule-examples.png b/book/images/course-schedule-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..348fe3de7a232c03bd2ebc49c263b43e2b5accfb GIT binary patch literal 22504 zcmb5W2_ThiyEeQGNv6#6Oh~2_nP-s@QfVZaDq~Tm5S5TANs>&-P+}!S#v)T@i4a1F zWXzD^KRn<5zWsiC|9k)YU+??8Zx5@r?)$pV>pYM1IF9oUF)`MorQ)O_5D2t~^mWV# z1QKEV^Nf-dKVjR`asmHGVSQLnhp@TzpX9QP7y^Nxa7ahf-1Es)qL;?e+SMgdfm`&H ze;JRHuvL-^zRG-geDe62D)H}u$KG}wf5GojRrnx#DU?<6r{r;6H{G1$SzM>KF~6!O2&3W$mtT_0X(8r>dxNZ~N${7M*iv)9vLujL<~;`hzd91@8kp(GDfwMiul z&{(B5aipg-)*x!~E0EMs+#Dol<{}Sd`v3VulLtzF$CCWZ{WsMPrf8^DcM~ss$vM50 zGC;9y+Ykqhj&Y0EM8p;AcmA6jLECq#sH(=^qe@lU$*VHHa_j0?vzNE`*RNl{GwmcF zO8e)HWCTxd@29Fh$9rDzi>K9vU;g#AVE#wb2LblG+$>7WGx4;fRXfDwDal2XyZPy# z1Xu@YxRNpvCnhIjyoC=OV56=Odwq4xSlFCdZ{=L6r>0;uB}e0Jj_CPs&yzbQxar1l zu@Ciy9k%uH7*=<+x6dulULaIrb!_`(_V2HLzq>@|;K2qPS-Rk$)TU?8gb5nguKmfk zZ!y{bf>K84O34A;t5@d>E`K2q7#J8PzvSu(bnPU(i&hYbHHe9cQB_f?+&safV`L@6 zuBN6|v9Y>`z`u7dF)fWuNRRyPul{$}h4dn-2c(J5($h`F9*}LPBM>5Zltoy>LL$cf z7h3MQSM~I85L&ysx;i^=MN^-t`7t``F;d5%qME%kcqiYv68DL^Xrcc8{>zsxy*g8@ z<*q|m_b`yZ?wz6U3166-yRV*d=hiI(LB#lpnEKpwzcL}fLc;ja zq4@n58Dr`@KY#YPdbKy-KGIxVS7L3pmTzvpv7te2bL}cc(D_T3N*vl!i(CfE{nnNE z`2(t~EKZ)xu^+;Odxi{R$7n1I|KTl5|ZBA6)T>Vlp z?yl4xUmZFf*{Dj-zV*tii?7?~aQ*)M`$|a<%h%(s*7lYWcQ(A3o0-`^GfZ#YK9UTstC4$W!o{<1tf{O;Ltk(flqs}zUsnTunI z>Yp1WC~eBi$$f5V$(@gmilTRN`t|&|$O?mSL7cSZL%#Dw3qruXdo(KydU|^H_G8W0 zqTF(7Bl#L5Rc@>@6Do&Xm6AFX3+i$vszaFOgg$@%tfZtQbnxDI%5EFko|&N!2-8tM z`!VYipbR`T51~ip{4wf=%)J^n@7~U30iust>L?*qE5K z{%A^QNmBnkI{LY_m7a^Mccm!l#-E;Fy+z7=L#_%uJUrXBZ96;V?pIw@SU7#9`s2qt zwZk68I!BJUbmyI)i^L`%sE<5V$$It5&n44;ZFYOS;l@;c%ZT11Ly@o=@8y~Ewzi|e z8Mo6&Z4ok6twuZ*&7lQw5fw_jhn z^X~fZ@+D74$El`-1HW;|7RF6wS2o8hva&9Id3Bae>P+U#mpV^5=#gtm*!RlFL~R<1 z#1y=FGwxopcK6}Khik=J5z*16aYC%DtSY>@g@s)W4cU#kx3mOgjTgTanMt23U2bjc z`VhQxe#KW+wM?p(nu=;;nmTIYZN{5)P3WahK2?%HI!vfXjoXfSr+a-GIBeiuC@F4tCW@AKDNRr5JWw9~eeh*U z$`DS%^gzYH*RPKg61W%{wbIR&rh4X6=8=`uTn8&{8y}u6^DfBB$|4f??%j(7=HFL* zRrL1U2A!9gS^I0-#u7gJ{GK$uNastJl>9eTPWjV`JNOIqtngd^uv7hsidXx` zj|a01wl}17x`qY{$@C{3DG8w2m3ykdz)x6R-Ew0w1hKv+rvB&8pYK0>_%$_!BQ7Z^ z87FnNqj?~V5P;(#WO?FB`R0a?u)fWi$)0@s7||nkGVI7q z<>lqqe}B{U<6>j`QX_k%G$rMHe~E{&u`!|&yO89!IuXuw;9D;x3k%C!W9>bTj+GPG z!o={?r%wHO-gJ{REm}rMb^o>y9cvkOZaPtMaf7O*y|S?fg$~KumVB)T;+5Th+Ez5e!K&n$FVI+){&(sN9 zJ~cJ9=ftaL85v_EBb2wbn3$O46Mp^p!OG6=fNybfa=Li&BECx`hJ%LUw${bVmzk(; z|N8X{xgXg8TbG*p9Xp9sf|JS?qJ!P~_U+ro#>PIoPkBW}qN_)yVk%1)GzOSXA3xp| z!XzqnuC#7=mV%CZd~A%3mG#Hu1kqBsl$VAVaEE6^}j|&Mzl0EscC7^lEyP*SW(<3 zf3!Z15>j4;+n-l=tb@Fw7u%ZX)vNJCpt>(FPcm_G;-qtOaUJeVoTlZw`#Mjimn9WR#+GZHL1z&@9OHco)fzH zH@zlQf66UbnwswQ_}PiAdihdf>d&*uU05X~i`m&(Q&Ur%s~tOb;Cgko-@meOP3+4FU0z!U%q@fLCHfr)}YLHZF$GXu0Gaq5kJ)4;sgwolYQ=_TZ& z_1|3k^>uJ?u=wiO_dzLXX_wW7iGv3Z(okIZULAr0;BXRoG{8ixuh5C>6h+9k*i!z} z+^7wwPxnSXy=QuL@u#rd(A>;>z?nO!N=!mRLQ>M>%9XkKc_1e3 znzvZChmxlOg&GL)o!7jbm)8o)sOwB@eEdlh6QIV-7cauN+uGYteeLrZ-j(Wi^pd0X&8^tb zYCP=V-~jlAq~0d0PwDw%+u(gpxq9ko>vw2fo*jxY*}IE1?5LTUh|%L}8(9wzkN&vJP`k5Q6Ze`{-$ zamL@jf3NdyRtm^ny3h8$`naW~rJ0%RwJ8hpmuKHybJ|#2VG=RKvcJsCq@8TVAe47{rBURtLy9_r3kQ^gGRg-oCYoTI=xP#yCsA;)@;6v$L~5 zefk8Lyn{&u`IWz-MpW)+)Yi8h2MDcyl9<>gi-c9=Hhl2Hg$w)k zsh$yxsV5M|k2`b9+SH--G2MT6U*_00LThK|8^G_`;o8Z`$w+_?oM^#lho;AJs%HYd zFLeq?>wN1W5RmCJE&c-Vl`PaLavKBDXljzoF~mD{qW-OLj|i18MWapN;^Z{J2ao^Q zcJp9bILE$&8*TXVuU}VDr~qaOxt*EX=O`1HBX-Zto*=f^%L3>n5|9tMdd=4%y zvIV745)u+3k+|phOED>_gAEncwY5Q;16(A8<-dQ)2)t^(-7DfF!=g#Pfd({`w6wH8 z^ZZWQZmsswqetU}5YYqzH8pj>iLJZ86+%0aiFRx8+XEfJ`i2H;+4vVHa^(*k&@0!8 zc5zSyF3=99Q@uWY#>eN~T6Raqk=~vj#6{WC-Z~^m?V_D`_KE$_HO58)ON{W%&(C|Q z@CJV%zJ5*WnSPLGPU}%O#ZF$sv^HLKzdoO%$ZCFmelFiiL&CydNt?q=uYTm_)NbLY;n7styyXTKww(%Kx#A~lU(;6s;Y)+!q_GzCU83kcM-_r4gU;Qk-674xlz=V@-syz zsd!o2*euMqsJryNjjp#@U0!DA;u z85tQK4x-_@M2L-z9cxZJUGA&cc5{LC5!*d}Pu1Q?^^HdlAKvLom9_49Z5xLE@BXgC zcj?HtS)I!Zup+K3FO!p#zdT)JtTxrF=QT4}MZ8d3=-i*3mWG@zMwk!WR{e#)r^tmb zvNkLTMK!3U#{(WwoTm60CT zT1%uo543Xg=1ou+BEE__-|K8%*VWa5Z+N2Q(a_tQFzzZt@?)EBr>>)otm5w77f~9H zW*Dp9Sl!JMU(V^%lJP^Q$)` zBxL-R?erc%H3~TvE`rAC(>^FNw{PDbu8rJDOKVHC(2L-%^4HSV)zvjOe-IOc+}>X3 z)Qg&oF2yxMGbg~yl;>p}OY-|LHtB~_XARQLj0_FSSAK9w#f25TUXaLuokahzrK5yQYkSaRj7&ZLwC2ntnD97S}H11 z!V^^=)_hO32y^kKh6eOGYqzP{upczEv}L7RuRA;Wn(gv)a&lr{gJ!ZU^{g7b!l&Zt ziY@s5-8#iY!Mge`zym0-+Nvs&1a++)YG2V3?%uV_7JZol#UigvQzI5A-E0En-d~e* zC26c31rGuZMST8w)z;QtE$%~`irRAP7CA3kS(&|iIb>}pW9r|arsw5>SnF(SOX-*Z z6XC07DZx6wvIblh8XEfe@nftlE+blBC&lE<*|Y0wYa8po{ZF4fSzJ=WxPIb~YF=Yl zZtibDfg8TQo%Y{jFD#mkq}VY0YcD@pDXuWK}y3NgC}cu*dK4$_4TVb zW5~kdBJwc@%^jSE@Nn9g`UT)KH#hJo$OyU*tsXplIOnNCv@lFr`1MfW;nR7uqenaX z`XrdC(0AdAnd`&sk`*`2P%@BK=LE8_#Ue3Y=%~}}TEF)6%zBnKG#Ge{XF5=vooh#n z-R!%uGUltsx0HN0#f2s+Q{()30fI&koxp7^Vo_1<%a_a{I^EUVCMq0Wc4G}_XlSBj zlMT*axS*Y4($LsQyi3)d)Mi0c_21~LsnNZCEC{^Kw{K5thZh$^3G^P?7ix~1n?IZT z7LT&MpEG=h=MF#TosXe8d3h$IMj!Qs?*|2GJ2^=X{e7yje@7GZX}l26F6ZJ-T3C!v zOjIRsk?Zb1>IgC?&LF+4FR;I=Dg`xYtn9D=eNCGo5$z|a$(v-`|9rd)z?_mIP+F|n zs&%18-gQtzJof8hWjZ=KFoVC!6vutFJ~ni8aTx$) z^MB5)nWs%wBNA(X*h`sv>(6FrXvj`;P*-=Gco+XV2Q70iz{ECE67hb0a%JUrB_&GB z&9v=@_nSD@G26VEcKnCeR7#|CagI8ddeeH3xHu{(P>k5uH(1V`oMTDfoubO`QiT2j zEtDx;P?(pOY?g(lcKq?}g+2Hfhw#7G@8}4gJbhXy>}^{C&4ju`a<})sZN=N8?#rQ0 zYWB-MOG>_Iec8bwGdH(3)q3Y`t@E<+_ymK`LO~iM4v)K|QuI6DMNLm~EujtLz%jy?p>LE092rh0O zo{RfAyCSeP6Ykz<>$)QNAKy9{LL0Wbj_>{Z_o>gHQ#6a*6pJ_*g7~4I+%B((G6FIW z`&(1XqeIrpO{}+(Wqu*x%gh;W=ior;bDzFu;=|wkkectUttM=2Y`A;;FAq=R!-uRY z2WY|Q_^!QiJ$<-f690VLm7=Cd?XA0rzN&JER^j4bHUqetgI+!2_&>gKjrPOe4@ z#PvML&8{zB_Qe}cl{zr0@czzkQJWke*HD{V@fDB#`QwL(dew&yLW+v<$>TB^JHu!R zGQP_*b8}a09%zZj0!$5*dV%{sD#3bK_&zWP8ocvkiCQW6DwF|D;_kah0{X(@Vq)XI zQH`Sw{!i8Y)uuIv^alLwP>IIdZ^zWzXr-74Mn~yC1CGAH699&*x5#B^&Z%arWCwfq zBPl8sm>c!Ddysd2V8gs zW(V;lTxhWJd(P6Ci9L`!T{y@ZgicaN&}(U$$C>x9QokZB}XSsQis?W=?=ZR)1Ak30{=RzJnJU$i_#wsZ&&f7OWZ+-Rp_1|li zIT;yj3=B7~(ujzN%rrk|MwgnH5qrOW*B92+={G3FX7Hb*$$3ixi=#pQ zpx^lYt&EA19EUz9CtNESy?Ul^HZXm2eJjC_0f{!^{vcDG+O^) zB<~Fn8C5~s5tK(yocIFdg^FBVeQR8XsAaT8e?Z~-Gu|d771ua=B}v`?+_7Vy=P9dG zb;D5iFI~JiF)~t(3g=jekjXSnbIrU@P*N?_B-S%fk}E1I9!XLgy;2Omeb=sC2LKIcK*}dHSrbwC)!fHTrn0BMhj@qNfCiD1TkOg?4P26yoBO4$&CSCD zkO!1A0uZ$XxE-6hpA(Qi*f`_5yF2y{Efp&Z3!3yBS%{5>lvtSFJG?XazMp%(`Af##3NavQs9;NMW=rEo;{7& zicg`kZW0?hR~@W_S2B-pWg#5WAkku zrl(IQL`Ms-hPBE4{Wm!&dD7es2(kRe-zaJ2>(`f%-=LRR59y0BpDXj0laK%kyQh`% z>8Yx+q$Dl19#v`}DAA|iza1u52l(nfy#xO4k9y0G}ikNq~+mk{aN zjjuKM^^Y9UYvT|68XDd*hMy(W+q65pNls4YI^aAwd_s)*sp3^T@JC<@`}@~{8qKnp z`MxBYYEqNatRwUyIpuzK98oVI61||Z%?(8Mz9mil^(EIb`1b8}GzdWyv<8NTI=0Pf z;Rn;qvV7GlmY#QVXPK`KY;Jr(XZY@SIl3^fW5-zVcO$Qh$A&s6A2_h}8}x%q3k#pn zSJwKtR33B0#r^$Ku_5Q&r$7-jJKmNC3V?=7o~DH`@+dwYj6}|xH}2?^EdAFPfn51i zy*qvKX(+UZYqpLaqEha1*R4BuQ11{QjB*x;pc%k=HQ!~>F+SejkXOx`lHzB#NL|+8 z55>@=KzQYxF1maFq&=7lZ1M^|2*nbg1q$=z?{A$K3%h~V(1w5$1s}wx?#Io>mO=Ns zT17?08EijdRefXm0u(W5heArJI|F07H`bkBlO+CcFTijAzbh-n@7|4#jWH>-4438g zOaWSGzcTM~Yx#Zq4jUP*xA<@5yA6Mou2?gpt(ePWNwAQh zqoPvsTU!POt3W@rXn6n0-U}c5-d#T;5`*Y__3W9>Hfkgn(1jnW|ICdx;;%>7kASEW zBCESZ9inpzoE9>01h=BB|Aw!}3-3EATWg7TcC>H3>^?oZnJB~znh@+;1j-mN#j!n- zuOJH_vPQ!AcQzI%9~^7-zY?-D=hSYcQQxudg)9UjcPrk}C0-cY=5a4PJoij-YI?ey z)7SkhT|t-bcOz*$H%>%vCv92YSHybV+s7vf`5G|gKDDIOZ5+W%mm|9x8_O;;h&y{EW`>=P1_4V(Dhl9HoReI=O zspANcb+**g&B|&JcS+2PBtsXACKYQ^0jk)H4b|wHyL;wPNAYV&CCHx}e|lZ!3W{$; z{5#=m^sVB&U?H|YwB~ztwT{HSia1CeG#s+z{rxuRhYp}4L=tT{5NJYfljUidt0%}9 z()H>r7dN*GD5u!)slMVE9YIvwtv;c-Rxo5c9XCDI?cPEs?Y8F)$bdmy;2C0kyY zJ8WQpjUa*|lqfXlEx+NTt9#pQfU|B+5oyd@#`CrRrXO$Qm&PVW2uQZF9Kjz}#^bwp zwRLxUHa?UDI|RLD{M2!hg_?&^QC3b)W!5!Rost!C04w*n4opL9=szs9^pu2*g8!%( zOOi@fdb)0k$?8I)k$CLK+FEQ?dvh}#U*sc^y(%hw@84Swl;6laeVp|{O&1E<+VU)9 z!FuZ0^G(nia)7Kp_ER9?VA|q@axd1Tv9ZzZZwWcOXtY5(I4}`W(LIX_ z0o%mFeu47L&ds%iSE0nthcG!xDkUWaaHi-r_w0L|Nml35bWX|}$ht+@-ixDwGzXA~n3OJ~D+ot4I6#NMIiQwN7d6^y^f(SU_d))cUFha{Q1fSX@iH|yt( zPgBsh(f@tRw?6{6NvM=sLzI9v92s6-#eri>6Uu1a0ra&Ggg`_>3~{OZm6n%pz_Sv` zr!IxadwDV_H7pVgaujO9@B~p=EG#D_g``GxSRLfB)Vd>Ga0j>$+oN_bH8%unma--~ zthF}`nPVsk$!!kUifDiLt5@?23;pIs4taRUg`V^N*x6}5TfXC9vdTsW$lvcDoYBF9 zb&@*s*5u^L9xp}^JzS@xm`Qf`y;v5OfbMvF-ZEB;pPukWPXdYjoy2lpUf$rWC$JRi zx|q^W5+u&|8Eq-P_WR`J4-!Xi{HtUiohk(pi9mR=85=E`&te%X5o_?ytAK`4^-h@I+q2E=nayD3O{%8@88!0g6FI~0 z9A{)$SXcmW_yW2pP#??*@R^9mme{xOGN1K*0M4Egqs1xaK=EsA*2B@fLP3Y&pxoz3d~` zh2Ua9`7_y_5M-!>T?>hhZfjBBEJY3xiJ2H4zToKSJJ}_P09}c<5H%HvN%?DLu&7`n zVYmWPl2D1$@j&)PGkgygr%(F>=!RO}kBb8qz50fAWdUC7zvY*W-zkEgCTw%$;2Y5PIoa7IZo?F9H7-zAdAVUcc5dNSoc;ksl^g7j4yE$J6691p(<~Z z;oKXX?e6Nrg?5&5=LmN9^!ysA@COh>p3|vKr83Lf0$jdon?Pfi?$fO1za$G1*ePm>cT~Qf`VYQ7{q6EzKV)o$ZI;m^Zu2-$4&M1 z>!3TXz>i}1NJevZF>VX-(0F0EK?V+$-ToELvtP&NUB@bvTu9Xi+bP1O>ew}Wh8R-3@R0_8f;Dk{=EF{O%v*jhXO_1QW_^uy9;OFG-z15<@iWD*j#RPqxiP8>K;gbf4@92*xWx@*^N zxwy@=nHArEnpx8~SwCnv_iq_$aC@?{bKh&i(5Qd@EC==*mfEIi+iUVkEfww)?fCe3 z!yo9t0eE1(Jch=IfuSv!llukZ3Ka}mW58A*RDl?ApuubSp@X-P^@0xsei_v6^Z7k+ z0Us}<@&)$L)U3jSAT%L+_5b)`w|#psbO>&QD^`PDG7X_OEm~9{WpU~h6z$nwmx_NA zIDp*ID_nAL7>9;3Ix6S8>?)stOp^1!h-k6)y@pyU?(bk#P-}HH-`8I0IvcECf2r5} z6UD0!616i#V2w~je89hpmz(g54_aUE*e zcyJYX@$m7rj9%F%D=WKi9}^>ERBSlVy!IU$(99rTfD?d1vD)rRXF!S}qw_6W>B9^8eOT z@?ndA`jdU^1?=p!v@0tspqr46eCK}{+1dR-pUh5kM_>4olM_pb&g$wa0)mF(LuF+p ze4q6;-kzRs-@eVWc!{$5b9_9YPCxH*oT&wSa$6;cw@tU~v}@LrG~oxqyy7*!@&;jJ z{CNKaGLUDNz!a&Ob{9+$nS@SO+&vE5ipdZ#DXp@j7FmwvA6$7JdrC})f<*4p5(Z)31>8t2 z4XgPMmfQCa{qIQ?pFf5Z6XtYu$&EB`#~t#{lZE2lckVXT)ZDIA?nOIrNSKkiS1$`Z z*3xuhyLDQd#uD)rkMio1Z~Ju|o12@-)$--!`1<)}j#JMyh%E zFm=g`?fYZl=kDq{{`t4#6|o2Y&JHb4Z>q_09Mj$sdXTBsY5><5!wW_x$Irmt8CpS^xcY)ivbjuSbL|sP1uX zzxL~=t+{8aqBRcp>o;$z=ZQJ654X27{t;kFftL~6Fe-SJfnl(Hm&Q1`dpZOa5(1P? zw}gnk&Q4)^%1-+Z3b`@RCKy#1U7W*Z-XyD%u1LPfbQp4wXT-*r&Q8d77cJ7=rm*eI zR5h3oFiNwLwaBO7R;8kp)W}xg+$G=lTnNes^dga%kRa(M5O!8|Q3B(?88|qp9QMyl z=87fMP=qrkKr4q*rL9fY6@eZl-E8-iwm7(-nrGr~pYmFib8{;Y#twd`HB;vfekvSU zyYIk(U|o9VjO1j(3&ypfq2$+$XWrcjaWiidBlh(6!trxKvJhe}j)g6?z#n^Z(kc|@ zylj#25%RV5Dwm4$*4)Q%AHs|m;g5i+J~neLKEoL<5AEY6_osNWd*Pa9jK}|&l7<>7LY;=6Wru`G z58G}rF;@?d&p*pMIVCgA^E~%1|2iPYC(@=tjD7gfx+sVtvi5>(Jp0CggJ4-=W;*4b z;{l;muEP|C=e&a{LX8BY0i+nIhmq)ztI+~luz#`2<6QcEFMr?6tm*uDMkA(Pw7I~p zGTsGE!?R%IR$F;>e`>&!X=}TSjw>Mm_mF-#p!P#wbT;%thy7pCwdZ*{UPfJVbVMD| z?SF0eVe|?p5nk&AWi}c1!I49sc(OvDhtOKd^AwksJ~7Vta7C!${pb}87vM7XF6pG* ztke*bKjY@+rdh_do0$p|1~bc%Z3>PahEDBFo{sp{U?NwYDr|%p0qzU5zAdVs3s* ze~+|u3sQei&q?uE_y-w7Y+PJ&AGDK`-gM4Tx`k42Bg-L`X&QwV48}Q7P0!ZhFNKBL z+|u&*j~^fH@`GtO0)LTDd(BtAI?FG;lZNX~3R`R|JyFskZxCb#EKST*x}co@M#;wC z(-EZQQ#<2!6pI9a2pfB400~kTJjAub$m^ACJyh@Q@_~bdnW;z!vhgpovUaPgt^;W3 zpL29_LJGt@}?X%A{Q+|syq6S1keH_u@$ZVL}o7NVyF2Z`$R zIzJ!FCcbA6PRtXUECuL{3;tm@8*OBTrT;Ncb84rP5cGv*u8Ju5^J=qYrwUke?X}jy z;Dpa#QLPl$N3xbzNN)zf0cHaw6uJe#)AQWiok?BH!EmTtcL#dDj7HsZFi!}mDWGwi z&eZGneVl^wgvyG|_1`#S+vAMXXe1@6a|L!R=qu3b+tpsnF%SXZ#>)o0vGj23 zc}`i6{i6N!sj?>Qk+KCA#yD1|q&+6=osjs%4#d*cuVV=n3 z?yQX_F``AMC#L_S)&I)f9x~pvk+$Qx4Ng(b3gqkjZgxU>1}Av@+Ky z4M>DtgNK8*3OFZrnhlwd>nyn$J2TqJTbUa^+5AT?W z06+213tDlaj^IRJb6x)wdf4h=$v?qJf-iCcgZ}N+Zj-d-aBUOYF1FE91khSOc z65#gsoxHxkkNqbzzOu5i(C`LA0I0+@^f;Th!`M!u>(G1Y^5xXS%3D_bjKak^(s$Q` ze%K}ReyF=~%+V}szq0aQnA#vt;eczU0LkBKvIB}mOMePt1cJ#_7?DAmd@v)KYd$$If0Gp?a=GT3Cn$Zk#?6WhBvlRIC1SIVLo&vb!*xS=U zWpO&_3AY?WuliLd7GasKmr2&)R?Oc0?k#G84U;f9JXPW`D;`fcc8L0hhNG{VKRPeC zG7hEz-1onABjc-p{REmGlc=$9wEpz;G{^u@G=m^}K}qfBSrF>=lLa106m@N6rwYX{4l>Vr<+FX#%?iCDJaLfX1Ta~MH(+!C_?$9?oO*w0qFyA0Fr()(eK^4< zOexezB<5E)@k2)kH1;hy2Ro^gUa=1%7urK5?}c#?ZF?~fgZ`3%$JAwl?U$niCB;q( zMMW{)FMB$TxAd1pSz80>wm5$s9UXfIqBJ@5h0XN!_5J+R5}N)jE{2DN2`LGFp3wWH za*28Quge3iNtXXOU0`c}YUmCe=r90)UobZ}$L(loX(jC`{ao?YtD15qX)~E8Q9Luc z8y>ZZ-@jczcy4aoK(MBMnApJ>@&;E6@&kTKs046fGAQmobZGUg@>PZ8=M<%0WOrY! zWl8ndp?bmty(RG5*=4Wz2Rwn*;w%Q4a8QtbWzAnCUeNP*w71b5?#Rg8{#*j{1b9L1 zGRx|OEt89bgMlZ4(epouS#GNrl@lJ5UcNjtvV+2HckrpZ|E^m>)&{G$|KF9X6ZxTR z{Sy_xrl#pYWD=s_-+T0E8J#&Ty9}s9b72(~-{vQZ=qSy`mR#0L5*4|{S<)8~INS_B9iRpC3<8 z+`e-wP8X?S3Fde7i69^HOG~+vI9ZS*k#eVeZ+#dV$CW>LP-ntffc=371Aghm!y?&a zo`w4=%d?JMwCALiiC;hE2z8%V`P$2{FlvEs*n9ZoN_tg;@7w`z5A~NzGAL8SQJIY9 z@u}Er*WAg|(=$C!a0u311I-5)REo8M1S<$-!^itW>TM7}V8ws+cWzK%pmL86X2RKSZ#@?PtWpH8YG_*t`;8mx z=$R!XUQm?$x@Uziw#`Jk53C*j+|`AOD4>_;d?~$`BcA$eC;6u))13!3Dc|J_a3$if zVUzyvVTKz1)4x49F4OJYsn^h0cjD3(bVT{ax5f zm_qS#PRfZ(?ry$<9alP1(a_Q|HtWevr{{P2LrPYxv%R)9VfDrT_YA}IoQ~f}T{J8& zQ&WxU$urKlxBF9(6}wU;FPj;2niR$e#i7AYwys^FJz-;5oF z%SI3o7>w#Ife*vElD3zF^0tQfuP@ipjKF#XT`V+AVKyT@-4^4D01IdGtVr63zEKB{ubpYDxYW&i440`=+93pP;A?kbgR4^8ddRJOj7DA^dujVB#CO`alU zO-69Id^t(M&H8ipF^sct$vc`9y;e+wlk8s=8tO^yg^p`d(%b+15vxfTyaZi`5O4Sm zwhJsHD$*oK;Z=$A<_g!Rp9BZ%L7fKYjmI+RyDMb3^7V3r{wk9=T_}OkYkvB-#l&V@Cd=6e^{82bQl9e zz2G7-PY=lxDlkS}+s^(qWM0oqY-~vGR=W$m2|iB@CqYl)QcKt*2mr9F5zWQ1no|%8Fb*+1I2h2xmqHE<%^33F{{2Aj zf|KEw#zq@8FYaERlx8-{PTp4V=v6v12m-Voy}in6YEK(S?J!wqXD1>oJmaZC2*C27 z5Ir({o|u@3ITO_RhzPnwW0)^7+ha|9)G~J9z=0Fy=AE6L58~qBqYl#%q`Lhbm3ngW z9lA+AKEA~y&)a02pPRkBDr>ikTJk;r9g?%p5e`o~OsP{5aA#3TNtPxiGtjI-;NX!P zpF2DEA2>jL`#nlVwEnZ)T$tpWtYl!MMM1%}1P2ELPK4EPf>`yI3O8jkcd&<%8DJ40 znrWcfdasxm!O}mxXux^FiRb})MQ2OPkq>vMKGSdOT|tt7E4UtV7oOW7<#yvys$lCk zx;wN&3N#+PtHBEw`}+IAa7x9EYY^(1w(aMf9p1o0W$wvfpfE3Qy!;C(NnaWD!EjP@ z@isR+eMTmz#yabE_v_aIacpgx1k9#a(a9$m`5t&(&a2{2_c2mbfrdc9vuTtqBv@s) z->&12k~ICCc2EvK+SBa_WlCD_p+1xDaaJp0fcMlMa(n=lO|5sJ&;9Gavk&nx;ydy_ zV41qQ9_kZ!+#YNbT4YFQmoC5%Ou#3qpurFS>%lZ35n8(VxM;Hb{+qP7-j|EZ7ks73 zN*bJ)=((Pd*klJUZ;Z^6|N6G6UpHfz&XcTJK43zAoRkSAOO1xqf!PtYzM6)?GT>n`b8F;SMT`-#1NaZ=+j_3~e) z!Bw)Y1<}FTZflEXC!T#rQChmuQ*=%h&$+Rp-b;30km0Q_hhb7g(E#twe}1%2IM;If z?{6RqOV|HUVo6Se1%a*p8;jLZv&!Y!YUi{z9*pf5=Jhy29D|CncBZf>sMCCAWo+5Y zoM!7+a4Q|nGC#xDD`iO`DQVTry`~~gvGq})ErD3?z37hM+rF`(QE%;|kgT}PpZ^l| zs|&&|-vS!rs@l>NijPuw+6P(Dy$)p-wGXD-(hGd#ji(=wgwh5oI?BI8Iw&Y$xq3vF zL*Ib(@IwM8?N!SLGAsbMe1c@G0jza*iZi$lXdK$H{GA$<=+<+Hu3~mRGb1Bd@5o%m z<~B7ot8tU9-*EHaw4#eQyyoUs<*V`f4fC_-f&1+97Tc)@6KMmtd(!A{tnJIoC);Ol zJ(nHEj2f~k0P8C#R}IXSRo z|HFz@wzRlZ1#T;o>u)2uHbt=XC2@3Yz00hP2NtnoSk>IbBp~wzrfM*C2l10Ypt>!{ z8m7L!aFp3sSTrbGJkL*+>bVT~pFkE6Ab85a)?4sw0+^uJPFNG!36<7F?@4VzlFgN! z7O%+_6c)Oe|5Vz`QyyPN#$H_&JV0zV&_=lP?sqV8xdDyfTm=P}{6ZI<)K+wD5rm8( zBV`pBqf0gM{z7C7sXU^7)3&j)@@CoVAU2#;8a&ViJsfD2=_^k#=jG|S(6#EnNuB+o z>PJ&q!9VYD?18x}zHf2B5auec`R7VGIaYtK&3ryl+5GCnHCJ+6z9axWh`+Pm_dv20 zr3uZ>YVZ>V{Cf8YEt6vVpP)Cu94aWh6$bdg_YjYr2;x!Juo0Hor!AmXx)t(pqWU3c z*%M8(%rm}Cjl6Lal9454U=Sk@7Q%I^U=*5bzeAMoaAvdmo~AUt!S20zS4ERMOv84v zVYxlwGB3c>phn~Z0DXRHN6T_RH1YHfRC~KFi6|2V<^fpP%^bS*>z$6GM*@A8Dxaz* zAI*4^yLCh(@iZYUJG?tAwd>nR^DZ)36w=(|4!P#w36(@^=0j7H6UbUAq;HIb+a-u z&ZWF?*#8)<1_p?b;)xcJ$oZ7q#X@vQSy-&TNYOKqy?p7qCe*sMz#{(xrfh6<6eK$E z(Z2r?Q}(H;3F7dH_KEW2$G^Tf!L%-#O^21@`LA5@mUt4Al)bl?m&b;F23STVLgm(@ zb1FkDB$`ogK}glrQ5qWka&YE_I~e*d$Q{QVzrS|A+#Js$$q4$GcWqEkY8fbUNy1}Z z2$lW)sv;skz%W`UFjC!yL5`N18dl{r6EP5an1TNAK01(`V(TUDv4cDOR;E7YqMxez zU;>((fnn(T_bbC6!||LQUvRy5XH0?((v9O~ci|aa+1WqQw}bP7p9#+a14$+uPeUD< ziA-e5`TycS|BO*SV6?ki9&}D-W_Nrn1bLVg;9cwM=-4MJx}EQL8IoKo_kZTH9FGJo zTFCxqL-`z@b#hB5l^?;Yi&-dujhTf7C|x(!mfg;r;Wm|>ycZl?3(gRI-zwNw_}QnR zTj=O5Xd<4eW--OO`{;8WJw2EH5;;{>p4+EX$MK9auuT|(#Josut_wbWvTXv#>0Zi>J;~^mO zKhILe>ImXm@USloKD`B1)0uU&ENAyE@jR{_6CwW>A648w^69bMB%mcmK6dQfdE!M8 zsflCMPUH}IkDun^vEFdSfP7B+6|kFP z`*t)%Cv1ga@B)zus1tSdbKW94ZUvb8iky18 ze2$hO<|o{#(GPz>T{y^2J%%t36tA#^QT> zudq&PNqLk=`QLJU@K!9^(Ufwxdx9PD*&7bo<>^%iH3o|opM1X7NWMFwNIysHbdb;bh)IBsvhlLjKMn7AT7VkS| zZtmDyNbA%Dgo+33!QKo8Kg9$Ol~bIM>AfdIwD@ErdrX`qJ8jFpG%&D<2d!mNDQ$mG zF$LHP{4l%XdrJ;YGz0^8%xi&~#^5mEGz>>^v9XFY*l6xVV+?U8;(>2&ZnN%uS1-7L zxXe9Qre)E(gI?ZBFZavooUYhCCj?(As;E2xm=4m@KxZx`B=k@M0uc{QX=1PSfB&?3aiDYig1UrP9hA`Ytd{tL(rf6l!h^J1yQkq zNh~#Re3lt;_b7>2cmyONO5b3rFwG!qBDTU%bh&UGV5V1jHaQ|9!b%H5qnx!pwl!Z- z8{E7_f4IKBUY8(^?(^X1k4rbv*Ll|`V^6@GuCF_MPA zi~fhp!`4qc6B5GMu&uQ#`r)X#NWbzeVnJAU?9hZv}&ueb;Wc(ap0-2g4lDf*zP@^O zVAiugJj@+yr8{;Uk5TIrJEUHD8V(&+HVk#~ezOaU-SB>;t~y#e9Cc4wMI?yh%r|$w zYpUFL&z4)7dnu`@goG+8D@*qGWTO!pDK-X!qp0}7BCROtPRPNW9P$c$A~H61Yueg= ziuK~sQqE!eab(oG2Ul(XCeFR~!;ITjT-)Li&4wmj5Q(&yx3TwZpy%dRFZS%Is?s5?f>%f<$Twvy1r4! zeI&E$u#UYKZJGv8GY`81+$yI@egJ-B23AxAKJE1JZ@l?uL11HWGo|pyGMSZb$~&+9 zP#mc~#B>%e(JNp|oMUOGM@dtYEBUz1n|DP=7YuGFYGK5bH#s)&k(uHEXe^#%NfX6V znwmg*8mR!b@Aw!=>&&nyNxszEXe`ZDX;?{iA&>5-9C5?J6Wb$$#p59ca}bxy)GATJ}{d={De8}ZlC*n&Xay|r*4Ax-q!0^ z+&vUuRhqt0vSfw#`QF|yKs@q~6tzEZhS&5mpos`gv`4IUz`vBZFv;|%iHBd?@ z=1`s}=GbR)VJFnFN@W6R534gi9@_E?s*PIxW_6gS(8|8FS1tx-Atp=siy8-U@7JV_ zoNP7PyZJ>$prRILc>^0}F0&7*T#RYe@5u15^VryMxyRV-X4=!S24sb6Bj-EWR_?ET z@yHtM>$>FU7iMN=GV=U*Wad^<22m%D-+1kHVHA@fex2|LB=|tCTCgPfu$f6iz%3Jv zMZWcazWKS#FpObqVPnJ1SnBoY16)^RIkDHHtIM37!_zEtn{d%i`W;@X9N?RFomrr= kGj}xcKGgny-aNCMJGUvhBk1b}TKAfSzP(NQRiHfYA9YOWlK=n! literal 0 HcmV?d00001 diff --git a/book/images/critical-connections-sol-examples.png b/book/images/critical-connections-sol-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3e568f4303b57b49aa362e4ce237f7d4c9066d GIT binary patch literal 35639 zcmbrm2VBqZ-!}Y>XlQS3l}fv`G=#oQ?Wh!5N;HH@X)g_wBrPfpNt>jl9YVAu4H~pm zilW_p^!s1e^*qmgU)Oct&+GpDUcVQ<<1^0leZJqv`#6sC8)ammMNP?0NgxoYb+m~l z1OiDf{?8`ghF7?(vOMs|PP?O8M8f9Qe;F@w;|T;_f)4TUG4FfRgFd`>`ZpEl{<7V0 zdZJ*T$07cBH}TEwXCD2}GOBc)I=p_El?i{GIbVJ5vS_-8Rrax}&S1sX%IAYm+PKR2EpHWWUh)v$=D0md1k%HF z=OP%SLwLy>jQBL^NcXVmHsd`~^(eN(bYV8a^!(%@bX0ro@VSrdWiN2KmV(vu!0 zzxKcTl3ux0`a$nGn@g9T+&XeN?EGMr=iR$^XKEAf-Se9pI(%>Ru$1k&bCqs`RXi_# zOie|fmD0W*)BoLfkb_=GNGLZu+he~#n0H)U-173W+EoQLH8mL-h7aC!df9kOMJoEn z4KZQidU5Ws;x4b{(|eUJ^l)ZSqL!Xb$!TiWL7@4d#>nIwb!5N&x)j> zWpqPC(o_8Z)pOoRA`VnvxnL5Jrs}JyZFA~*;ATL;qpGSZi-hF+_x1VW#Kgo(MCi^w zI$>3|ns0RMn5?`!9+5ZkZHvfIntI`%7v0^*3=IucRbQNbaWyY5PdZue?Ah_nwQ)5b zwSeaAwV(9ykNacXM#qTZ|>|KT8;DjTgG` zrKX|8Vj#oOb$-1#v#M(4&rCmIXms>x!1`4xyB6~E&w5f)Q$H13UvO~v`251x-rn9f zZ{8FX6sSkg95**FwkWl0&p52FudiDC-FKoh?2(h38_lj=`=zCWH{ZUF6nJ2gS6*KJ zDwc;V=+>=UFJEeA@*n9d_59JZzWSGpjO=Is^9vL0511&!HM4H=sBPft@q+pcr(a|y zMT&}ww!M278ME!emDz!~gap-#Bcz0T%2y1ut!qeczjt(Ps;?&y&O1BjKYkn;lXEot z@y9Q<{?%80eu?APk~r}syUps1jL(mr!p3~dGKSJ;&pe%+ggcDsMi(Z#($dl#9UV0_ zHTUk_D=jTe)C${u&aFrO%L`vJLP|;sJ3Bk^RVT$hmuHMZ2C@nYn-dqQjvhVA9V;Z- zKNB%jb)<~pB1cb8kN6d;u@C9AgqWBZ@#14{9F=1wA=HldJU}RK|sVpn=Se*K}eJ9ne#KceC-S_02d)_8WDzEE^iio&< zshJ!eCLx?YeVX9DvM|ZLHbzWYkac#Jlar&Mpm=*%-1OM7Z`K)flAZ16W4Tqg5%~GD z(l)EAW>(++=5oKdbxii`QERMIn|rbU?EA8fUYtAO&Yc@KZz7z$RZjc+zo@KSZn@5C zbCanY4_ww^M)p>ul!<7kA&OHTZKcs!^?hXqNC#lcYiGOIA zzA@6WOFp&jC!6!9B3J)ArKP2}Z{N`vg4QZfQ%fuNdz~1| zkKFWt%nqlHjt&=jWnAF>dxOJ=_w3u3H~RG@W|@9`K&Aae0)`_iF5pqPAG32XJcbKS$Rq0)>ju_rI}c+=f1BV=-TF=J9mzxK3>RB zY5k_BUXY58JD=O-EU$M-(yo1JuSQSR`Xzt8)YjI<&CQ*vaKUYTwk=g*W@g5!P9|`} z@4$h|$B!T1HD7Y&;o=(nMH$*a2wGZNx@*3$us}scWtrGiN3lB6a{aFP>AC=F!poO0 z3)Q-+W|r0a=H}+^nny=R3p2fW9mlV{bbQWR#niN`q@?8T=KFgG7zuxVe*HRcd@ABH zpJv+%mSt(_Jk~Lmicp;PQ^&URPEHd;y%LS`^jT)3LL<2t+KKI_1P-M!O&(?RD=I3o zDtC#Bj($>JE+HvNOHS^zKHHsV%A?}lzQSy8KZ-kf_wJqi_p;jYjKadfF=j38>d*<8vt|2$1rG5EXw>djD#=^|J_{loZbN)~q-{-=YvDtWY z@JhI@Fl*Y5KUgGQ*0{ZjD?d-0m~?)Ade-60#`xQ;$B(D#gSVR(pB5Ju9hzxYR&my+mX97iD)Y&?@U<4Pf@ocn{LrJwNwaC@U2Q7) z^y$+;+5R;wcNcjp9i6N^xr)f@R zDo?q8|CFU=-;Ynl;Yy~3r|hKob_PYz@|YbzzMGxB$f9%v15@}lMc&o&(4l%P*e`W~ zUk3)>jn30>DUlLXxQoXZ?A^` zaoPkUbMuJf0*i}_C>i3L`i6#QOD%8@Ujw)QZcCBN$E$5^18SRVPXjkM)KXaeu)?XS zsYONe<%=aP%g6~5r)wgIW7Wm-&iBv=2nZ1B9~oy=`SR{T-n~Y(`-%VRA1rx)wX>6h z)mQfH+4J=52W}+~rw;)!f1>R8+zKB)bbNVZHwKdXpx;su$#y<|{u5$%uV3G_*&ra3 z>~i6P^~sZ*Y-|>0W@hH*e}@{jQ;qN3Cn|~pb>P5(Wd#3+G}TnKz}lJ`KO>{|*n@Sr zTJUxw0s`M+)i!!Dov{yj(hgj99BvH%TKE2pj8-i7spH2HIN={- z`IQ7}Pt+lME-e2Z{~EZt-Wa}1Nl9t2PfLrat)9QUx_Y6n?A+%k4yp34S2s8O)z#H) zZHE#5$Tl}_+%UMWgp+icJ$IY2m2)0h{qewcZoIkRWaX3Z30V4ff1a)l3Lc8q0aBD5K z1kal+WxFjwcjjY$;{E%BqpxC@f9~A5vwUCj=2ah`kpN`2>uRb1Sw=2?orwavr}*V=N?7B8C-j9g-c!ylm=iA~D(7AKN4UZ&Bg@9!grq zR$N9nAi*UhBzSsy;@Qi~5qfuZb8feu!8`0XHM2TipONXXDeBRS_+)=u2Hz~MI~@Ug@5Z9#li^>5624S;?WR{KPQ_~TYE6R z^^8n1fJ&C;O%o%ddLhSbQJfw%Q)d7EuCA`9PoDhx^{X~uy>HSOYXGQ<=b&H3g9m#; z8>AEzayy(9iK6qkMO+nF<337ka`N*0=qpL%{o_YDDJdJ7WU8G_-Q6Bb zbHf4*6zNIflzZ(6K?4H=D19$mTJ{PE+(}3<7QSQKbWNI#N>Z{Ik&XI!4)`lCZ=bNR zkuZ~nMhg-O@YC4X80y>Y+YBt%TkJ}Ks{W3(r6L`gA3J6we5WHztG~bBFiqw2z`#kF z4YTI=NRoE;_CE)!S$TLi|IAo1M9JFJ6LyA5pXdw=}+F()SnlZashvf90SHn$Q8B5yu?2>dA>6|fnC<(oo8UESu?$9%0A&dKTN8k>e~c%nTU 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 IhRzZH2Wo5Jk^lez literal 0 HcmV?d00001 diff --git a/book/images/critical-path-examples.png b/book/images/critical-path-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..63b0e330e430fa49e294f765cded36b4cbff8158 GIT binary patch literal 40870 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�mWUo8P9yO72hZGhC*qM77G|2E)&&sj}@zh^lDhF$H1>E0QR1m`KT22DP3C z^OJcQ6zUJ^_Qp5n`2 zz9xdIns3tEJ~a|r5j8dJjlUbsX8DSR<-{#+Myt0qkPLyY>2!?|TP#_znv!o{)JssVbxdv+_RL;gyb8Eo4a*B$jFy5R3 zgXQ=0O@n}i6)ckB6#%<{z(EHERVk0Z805d}({5)_kWsg*ud4vdQ{?O1_y4^EK-(#p z{pl!&Z9pekY-Wn>egp`k>RTqlmB9O;Kc4CO`NTj-g0>v%nYzQ@z#l&tsxI;}CgPq( zia#4}3#Q8d(u!VnzQqn(0S2=UR0Bc~hMFi-ty0MVSqqu6t82*N((*BtJi+|1IwSM8 zQrg3Z#QZ*IZb1G#Kw2f*lR$=YG>p5N85>*i7cQ3Y`|sK*OXR(PTNLw`SOD!NnrTfc z`iQ4^QN4p4fX%4?6!eDSwxtT;z3J<#PzX@Ddi|u3@ZjY|*CtB2T<;am1WGu~j{MDI zv^(jSDBf!(bk6%adSher+LlJ?y(6Vu!I#y(tBb3160Y;F8m++xLFjj5G;xKP!@abBkl_iQZbA9aCyDH0zK5K>nhp|d4Zil`ErJ;k{{@JoOV9% zUFG^p%^j1)H;JuTa>U5IGZ4X2K08sf+1FyF=R3&SZTJCAz{K_x8>?f|s&xSW1`?7t zRNA&sh*GPZaAheEFS$Mn`3w4XB_D{b-OktLzR#$9_cn_Od#WlG^rc_pv)ldE?LCKR z`vfuj6B7=lJbht6_4O2Qn@!oKpdn)(47Cb8W>ZwT`Rms&g=!~G2+)5(okR#d6B8<> z^->wYxjcUSxW>5pvI)E*u{4e3E!{0G-?po_n`^#zKId|P&3q-dCT?}S#Tjo8TAs;_ z#8B3GShgx|3%*qNaAi5O!4L}ALLvw_Lrku#w5^f*i(n{KXZlz~0@*q}e=r@6Rn?)u zTtHj*S@~*ucktN;;DM9Xl-QH4@@+WhcbSc+g4n4GNAk3gA>@+L(D(qP0_O*ADG$0@ zd`?a?tcPOmA1v5$Ny^2I6IIc~)(ZN&aP)P@t+-ZK!!OR($s?GDyVRoVstrc_eAJ!s z`SjPM$BLr6wwmoGB0bfw$M0LSzA)d+J+ypgKlk2cC>}h)9kB;LQvs#^S0b$+{jnf z3dY1BU))7@B75-(4G#SeH=iW=oF+35Sq&hdZVjZ%dZ(t6SDnluFLgzGdwARjOhUx1 z&TKTu>2UHJpxVb2ar~>Zby_rhwgyNvpsfV5GsHay{``BTy(>0zHm67kUcV-i=?2j>}3Z8XASu&m}IyYtN$7#OYq zasg8(!fa(K6$<~&U~6n@LhwN8vKdVfV8R&iIDYCWac|avnU2<(+Rr z_YqY+fmT88S$i36XmE-}z`U#_oAfzaoH4{Ge~XViYbJs%G*C2r;+mzbHU!esO-kb4o3ZjR+>_ z35*wvCJ4#^>>$6e>D}8yY1{D$z<&gEka5NFlsyQH!G#9Hd#B5>=IcW={C)&J{{AIO zJzC=8L)1zG9y>d&HumN4f~0H1v0VqN>?L-L@3(fq#-MY3)qb#jjUg7%@u@w8yvf&4 z;>!X9f;LJQH_>wQ_rJ;Gegf=2gNy6c)qZQq>Z@hZ zsFLs|pA2*Yu5dTx>E_;E;jNv4Y#CYkeQ+TH^V1#63=4_Uu*$~{z#l=)p-G_aHfaPT@ zlhr=Qqpix87*4EG)A^f_;@@iUQUSlJvWE4FVz9CBx2x-IaOr8!HF)y!^5z%v#R!?Os`5pIu%35J)mPL2Vy0y(8Kk{R;*617UnZ!j&H zF0?!W=%rX;LkDh|8#1Yq-yyF6B_IejXPUy_S8{T4VPRoV8X+on$mk%m`p3j{A-G!~ z9}*C30acrAjxmDs;|&8tqFk0z!Pn6MIMw~}e8_*le#TDD$$>W=MDT;^4!v$v@^h@F zbEE(e75~nyhO%m9j@3F8eYwF1R?k#q{VPb0N=y(83b__==Lh<_b>+9RM zc_q%*PlSY4C#qxHKp2I?(hNFc@w8Pk z)R$m4LCA%KdE*5z9bj;HtzOjunOjg$aOUE4pO}<%?_^gKO3%M7ZFQ49zXJn)`1?Nz z2?+_JRgV!4rksU&zdSoMg`)_O5Xw2_uSjGUG>{4=CZnIT0DKDI_GBg-z+>-*^%Ng4ZCRJON*y z{*Z-D5s8X6>Bh*-{^VK-?$*=nyR4(*%3S5~cLy25)`u}l?HFTlnF$^f#tH-FC*Zqa zKJQK|E^YwT=Ui*xSIEq7n3-z_1|B0LLk&t}YEcmX{jU-zP+av z#)0kPQj=#febpvqJP~^ z3qUN4o3QF6o>y!&N{UrU;jwTaF7qFE9POrq)!STLZ=4)j$I*q0ahYc}i$$h+5O zZ|yJDPQERgE+@}+`SU3}{4rKa3`TSeK}R&Q$D{fjE$eFQxaZmG^4(Z$-##YPvWb#%gZTtSB!e-D=l+cE+_+*iw{3(+){T&T^|n3O3{lidFbLY zSrS(^m#L=eXy|mwI8lL=A(xgT7I#2S{!O`f;MfgKMtvoM;UlUMB^AQ#e7D>QUqwac zcECWA6647Z&&dY8&6$kj=EJ1=X!hUHSyOZADJf@C$LHHS&4gdjK~*$(WHBC$(DDxZI5Wi7&8I%s#kw&oq<{g00y>a7_ey_+oS$-r_r z(_1B!B=gF6K_0}GGW)b~42M+oTch{vEKldb%M}8#Ng9fS#nAMdmg~a?*^fvNE|sUk zll>-MZ#C|OMb^9AjacXDp^2z4yDQ6eyopS&{VwKhF{>Oh!uuV^K!>`lg^BsbirV2A zpTp))sneawKc0FleBo@*jHcbyoqE4=o1y=6OAyWBmOs*4oc4XR&z}TIAbufL$#$@w zQpTsEl%vK6^Xk@juvz*6ZfF!$V)u-J88wAG)+t@dxTJu~{@Fjb>Ax)!!|cEkL`4=; z8Dcq{lX0(1PXni`{b7z;^;x=wFCOMUmj(8lsA+$`Sz8MRtKSjn(Oh>Idxs_iK1e60 z#_SqRWma+(@_~z8@`ad0Jq37Q(`|FOFaA_=-PP)~GR;y`E!^4}Ru8R`jr?aZD5KmH zIx$pF_tI~b>-wjcAZv9Wu8(!HO44}P?7rFd9nsPvzg6^w+JJvtiiN%CGB&5*Rx zHOCSE*yQJd&n~0BA$%LLP~Qt!VJe9P>O3(_&I%mp9*mJJPojS_nv_v~84}XFhByLs zEr`XWQBE(qj}e&`if@J`&%<+aqNz}Y7sC}yi)M+i|3BsTh1JETyT$bNvB;~CXJ%Yp zaAz5QT3x;IukE*QlT z$CGH7Au2RHvcBefy3QvJCGl0O<7@|b7bcB6QSA4d{o3(`TK{$7aemG+D(=1Gt=bq) zGl5sSeTVDm*OV`}9UNr(%`6;01^)9~VVfh_R6END55CD}Eco*F5SOORR($PwF;XU5 z%?PZB5GB zR~n7HuqJj%CeJESQhdMMm1~wX;a|aunA7(`Z&864dK=f^rhetbp>pG$d<0-Fach$qgl{g$ahmEia{|9Rp^X_@cvmD)>s2rTKFlYaSjTgdI zW?70DYXiNV7|}b&5JQc+zUvp94P~Y4)R*xhcJxo!(ZZExcLzO<#+iN-!;}s1wW_bY z3pPhWGTBRn$sj;X#>*fU*gTWv88P2i$2`SP?1i14-kh1exwTbh-Tcpu9wfoWRhukJ zU;b2P6_4R1$AT)*+W1TcH_dn|Q`uS+anRf(*I;5SHy@4{x8uA0L38Uj334dDBh$#p zBv-to=#7}DxC0$^H#UoJ)mJW&%!|IflK)VzF&-! zVUmPD$P@700AUy>Et|?(6lD?ZUF&}~&rvw9J@xqxqL!wHh6^Y=LqkJA?S72=aJQ5P z^C=}2RVWZR(C#A4&yRWcF1jCK#+Gp~t#Q+8|Kb}atEQS4Zkd^TVG%g3c)Q&D2QsK{ zSWRx=Fa@#W#F2xtPE3-tzw`N?o?bZciNF2*#njZez@h}ssemvAd}MDFDQO=tfQ7Oz zI1eWKPyzuP!XDsE=0){8JX{D$W-MB@1?bpNsd5Mh59HoV?d?5vrKE|bns54~q)|vH z4oUdZ($Xp_DqxMPhi()$%Qf(-+}0n?_5q2iXv+6Rg2$tNR{J9~`5aO(3^jw77!aYb z(pbOqrK+;Bqf(*Nq)uVp+Y~7h1Asb-ax`S%oJs@Wd~_5N;e^~6pK|}^O^Ak~QRLPP zTFP>Aua~>0Nk~b3spQe24*Sk-9Uv&&_JaF5c6&TBqAs5Aj9N+N8(wb z$|UoXT{XJYvy?%je5aqT{~{zHxOGnH|APx}U}3c%4~^j0>`Jcz2w$#%+@P6A0JIU9 z!$jE(rIHdEkU<{a_t+a53rSF6#Q?62TwRSZ?r?WrlvwB$Cuiis0(7(3h&njnfCOa% zCB^!1EHM+)U7-M*bHn=%4(WjB#ctiw|7>JLJ#KFd^o^L*W`O3W7s}7Iz^c;#JR~sq z&wUB2Yr*;mK3lMC;sJ2gA2fUQrpMdsS^NBo0)f4~2zWAkhllIy>YnoOIKHJfZ)t5M zqN4Hx^Bpm1vOl;qVX)b%A~QX4&qHXrMFGtg6)hsF2PY>+n`Qh*l(KpLo0ZJQ*-C=Y z!!;Q6hJ;GGk@3|l7odUi&6mZ&nVG6q$p-dmgh~j-$R60}N=sRnmeR+`K~)C7=5nwm z^c8_Ui33a)c&uhW(xg)m4K6*opLxoxx4WFL_6eh+qX&s|9 z0WnwN@=R8DdJ02*8izq&CKy~oUXyB{{b9p3HzuuM$lKXre*9R>V!KC5CO)wcsxGea z<;%C~YW8Th!353bvgf!4$Fcdbgd9#Ny}gn-F>>Xv1LNb3z<-ThSNGaKEX+M41HY<@ zab2<8;!O)glNR!fAMMEQ|H<*r@r8Ia8>K|9Icp&VD{C-z%di_Pc8SfGvV7O5gxO5%tCN)m$i&&F0(yXCPn z2nwt~rXx&yt9?9RF!3ldTt~?NG)g6U3?a*>r>jjx9!W(dKsJEg=3&*eNebl zd!HX1$|4K%^49!(g0q?4VY^2hiLfMXmETTG(%S1{Cvdp3#fo6gp->hDX8z8d5)2^P zJHjWCkiE4h%P=aguihfcKF%_l@88vMxSdZ=Yu!F`1&84$NGkb2f-54gw}a%o+M946ezOercxW)_%aEsaaBu)lGJu`qrl62*-N@fK z1_LJVmX_)VNT=WWQ&RR2|0EuVk?%vV${hmf_OvzWYqo-GY%$nuJP)em7G+M8OT zDF>>}=H_M(X#Mh!h@iCA)q+;1i@kQC2B{D1J1C-Q#6lXa0j_uMy{;P=`004wL}xf=??szVyT6m#u+&+PgtW?|pa6cJ zj`@RCW&LddiANDkP}$5wp67*~j_{*`!n6R+a6aFO!DnD40v}8$L<9~F4&Bi_67Y5h zvS+@9h7#ohJ$k>eFqR^tOWIiHsl`J6OG=-lBnkw3L!-=(*bZ<-EJ%~7g^%dz2S1S} z#jXTV(ri*Vo>6Op(@!+&nz{xVl<^YoWgHwL5QS|#( z=WuXwK^yD@qx?$<;6NIMM%2Fh4ck4xz5)t zIE?9()`I%|C8mr=+k^tqY+VN%r9U9zq!nIjL*K9?hN)?q#cCdc%or`*$8djSEUVw8 z{)|!~*Y5BI*JS|)7(BH17HF=^{xq)d>_gbQD%OfYU;S!YX*z!oY_WXm>aoyr(v$j; zsFX*F9oi|NPZ&HOU>?nix89xtBCHi(E)4_6&a2i{9ueJ~u1Zsi{v!*&DQ$pvZv3Rc|;OzpJb3hlhuBniL6WH>uE|umf%= zI79@{KNJ7AmO|?z?1cFyH_*k3w8098f?}~3%ljAl2k5PhB-~MvKW&WoY)m^V(rlic zrZM6F{3Rn|o}~7l9ff16Ki`j!6(4`8caOW+6+pot{VLUd+TJ24`-#s~791I|eQ`YZ zA$rfhdSL;pGR^T5#HVg&+RsR-ywt%3}g>*auq5ii?OhzTFHIf z^Ax85EN}uI&*#|KxmKIa-Ezy6n-L6YO?!)%qh*H-5WdTm#t!zSt-4lKOrfcV8rFaW zI*ZxaH#2z?o^Ds2zxKwW)rQc4$K{}~Wn!TOnV5(_vk_Qk?XHd2)+|cQ_EwL9*4I4Q zDFg)}w1iXj`KS0h2u1V!SQ^ycIGNN>FX6huGD}17lHwv`ZOxzT;*uD3cR$Kj`R?&( z@Nv|=6&X`#KE;Bbu6fWC6M?le^C0p@*x$31nSnwkTdGAcQ{&LG^|?2mi;c09Ulj%A z00~0uuV2*3V&igiM;8||#ct;2gO61x3Z1XD!0lXnamsmZg}T}YjeP%h8miCP=88q8 zCoe{^#3j!Ri0XJ5fR`T8Kn`-8#ddZSl@F+%lKI+VD5!l4GsmR^?U|6 zKWNHDQDFFu85vD87Mp=~goKn75AYF!@ha!?e5@lsZreF_PM_z+*e`QleDpex0|^W6Hn zcX@d^T&}52dj0qeo`)#4K=mWGCTDxeUHxs^sr+4zn%Dx`;$7jEBmzzxa8}zsd^qKR zrjf7x`}Ym!%cQ0n;qUnDUC{SI#i*}qg(-X5ZT4d5aR8=HoGY#$y$y5p;6%L#jj8;;ctYSuf_u$E{>0h778}S^3>+^uZpU{QFR|W!lAV2| z6h0gQj=D_6{GI*%1o-j@=*-DCnq&jb<~gH&P}8}y>b-ks;9!=Y>y6Z)^Te7g4|O3H zlF2d3*{%AYcnXJYu8rgWWkL)}_0jHpL2@@+O;%b`KmKGcA}Hw2x2&uz{&Q%srrsM( z3Jt{qfmEd`GsaS3uoJ$G0Bmxl^*u||TfMujAk~^$SuKG(t)aQu zfW&wBW1I`0=dr`#zH8WX8<{*DRsF=oR4xfz+|Hb)g8yPGWF)9x&-+Wa+?$X>qMx9~ znVTy)g^vN2(z@k45l%N^VJ3899T7Vdf>Af-?dRN19DkJh6+A&_ZVn_{o4!-d(ALob z>V_bdqgVQS8t@zS2;=3{PfUc7NeCA`)#y)tAp~4igiD{PqGG!LMMPKm z#_jl~RxGM2!*3{$CUSg*&-5$=!u_b7oI2SToj@srto-ohL7ZMk5 zs;m3ppTU?T68?7S%a^Cdo#7EKIXPRh`hB*``o^?vKS=aWK9)eYQb!n_>+!U6Y=(S} zl%(W0;UtZz3fmiOKk`$<|WccHi;CNm&QBRVCy9DW$B9~U@CLcrZceuS3s zRqmJF&&vvmib{)|^i8X?4S#ru@4+;r3Z=n~k9|9eP{usxv@2+0tf2Jt zT-8^G@8qbNPWj39y^DPqx+gS0f3Ag^fq}^bjv#zX0JKr>Oj=Lx?#%K)Q}8JCI6>QW z-$=#U3{*yN6sTx;XrV3YCF#=pzdW&gaiZaG5k2L2+)hyk2NvQn9716Gf)bpFg+*b0 zznW4{Z?vI-qhYf0Bz)lND*mVQ)%x(gH_!D4$URC+DX?BQ=sRSC#QYI_>mdAhg2fto zl1P}CLY@%uKPDv13G6z&IAt#>$GU!>zw@@$6Qhwp*l?x7obg{pP6E!m}LxfEZ8p>`|oGwK|yZK7%v4@8TH*07mG)};`KS*3%2at#`q!&I87Uui% zC9x@o0{dZA)nF@#&(MB_gI%3#at%)Y-2D7`K#Mw{i$g0xPlc^HSV%{UjiG=pIEg)8 zty5w%U%~{M54erW5zWfodx^;|zDqasp|xJRqJr|-d702h6I0Wdl$2gzW!~9sCY%TV zIM_FYgoF@APiPhAI8{?sFsBUml1?$|P5oG?;kUT*pwM7lu7NjvOg={tEGddr4y^D6 z2sL1MBQg)7Q9ep4AHZTnUK#nDFt?m5F&!Or!T$Pn(Lm;ELs#^&-dI7%STiADKFAT5 zvCa_PrmL$Yu!j2Jk7=so*g86q@Q}s3OiXhqnMSINKl{yZ-BMAkzPh9CJc*Bi(Yd9A zhmRi)o}oY$|Ij#OgV%5OXkm;0(d!@6$CeoOC9-f@ei+{|4Wucc+2TGa3omf2B9drm zs9kya^S71u=Xs{{6wt966cSJWMQ8c1>AW6PywdG9O-(b)Da!8RLhvKe%a`Fle`W}a z^im9E`y@JDQtBfiyP9PC`~OZMA~dWt$%g#*2jutbGX}YUpP-;qQ~!$N@t~yP%UPKm z4=pI5uB#J=pL7&p@X*zKu(6s^L}zJ;6-O+a!Pb{3gbMxm-(Y<1CnwE6JYtE+Q$5F; z9OhAbrBCYa7NROrAJmoJ5{>1GRxP*s3w)uOos64Xlt*Doc9*aKd3a#zQKKY0L7iD!`11su*k<>;F6zmJXRem(Br9gx(o_Q z2o0h!Xbe@i(w?nzgi=6EkJZa`V+0kGma8U+Le<1X(%6>E-rmIWnYk*< zVJpMBK3`oOh3|^chrP2pHYl(;&uo;*ZXli$WdLRf#S)X3(2zm2KAa=3fDN$MBRh!ZD5rwPZt6Q8=AT0;Hpx4X3r-?a`4p+s%MAN)1|}xC#Uaa zg81EsL?~r)=f{oh!I1d5=xgsprK4)npLdO^9}NU0y1^SNNOaUbj0MdXK4U|6iz+wI zjyBu>gCPNzj;xZe-04b!AHpFI_zJwqR5SwH;q1ka5KPs2F|@i{=35nz+8mHaJ6&SV z&U|W&Vs&I-^2^C78OTWp=6Mz;f<@?#X4nOGPiPkp2$?Y*nufVXS8{oA`a{3V zi-!M3*;__c)wXZH#x07{DIjo5cQ**42-4jpAdQ4{t4No0NJuO?q(eFd1*A(rM7pFK z-g7?Bf4}41W9%{Z-k%&QtTpFa^SZ7xe#dco2_FNhkoHaA6P~jud^8`j!P%WE00m2N)>9=@8dwB4Qq4CvPrG53BnDvgr zB3}Yce-HSB3yvc?v(lB=||)Ru;Kwb=1inI8z$*+AwskEEus&4Aa#Q%h~Dhma?OAsA3C zg20GF6;xR#T3odxg_n#kEL;Ag5XOUAsDbl8TJ6jqcxk%GW!g)JhN&YnU7ZGeVYZDn zb8+AHGQDdFd;7#h5PWMKuC|o%tilpUTlZ?+RRgE$3H<*4b%dko3d(cH-GHWfbn0hQ z6AmS|>$cUaUgFI0{;CfE#zg|12#4^_;USW#zcjaQ+6$%&3J%VISY>~0G!$gVV9ny6 zo0~gSF7uCRZz8v^4^C^Vc#$@~bfJdh#1~Cp*Rn6JhS{dyCZW5Ra_io#(QJc{mQJ#z zx?d@Kir`H&A~h9e?=wEL?g&mGd4>u`A1w7vqiPlf?dB9-{%WBGab}7_>KZ)0_kaEj znX_C~w-~u2Cl~9R$9-q{E)Zej(4|5=#6aug=I&l*HOjPmki9($C89(QqZ?2*KL-z^ zjk)G@$YNFNoh(tPI027C8wrUH2`I0Be{;Q=%l;Q$fBLxBHx6gS9RUsF7z7UqzZO*E zf`ZVYD5QkT>f`ev?$+`EGgsrR(wAy(VV5wYjR_Z^vLahrCT%9{qk)}7p$LN^NHXik zpy#mXtFfiUBjSq|bo4MWQkGfQDJpKA(LY(Z_&QeZJJdm^?87DxgX$9W%cam7YGx3;$1>*7Eondc<=U_FxC!T7ezHpMqGyS(Q0k-}f=%&CQv zdEn9n@FcyE5Gg37pw_3*8A3?%$b*O2`BTqJTU$10(0~h75`=|NPm@8a^Pm7r_c>)m z$yi=lD()I5^E#TI9S#<0amIFZsMR~2ywxaP0>hh!(a}S3@t{BvYQAs@if1(+E}p(Y z@kj>D*^J%?`W8f0dz6Bk*;i6gPYp}j)2Ao9F5lBBk?#;ni(SjjbLZI7CF9=IK>X8)A3Ax*&>WLM2syDt#9jDG;HA*SNBLT90tJAjsL- zteFF~LGun6#&P*xdi|W4L5lKlGLgdS~*sHoQdcWlr!p5?0NzX`5>%A{QFTg5?Wkt6V}>P`4o4 zLbcshj7fKiiLF5h@YXmF9!P*?Kvm|vdY&e>LaK_6|D|%Vj`mXDdiO*b`RXveKa{Qh zu9w~hw}oIV^0mQ|RDJ^kLf%(W11 z8y+de4i3g4yBEjAnAQ3z)%qa>8FDECQILo_0$0dq`|~UCyNM74R99Cc#3h^#gHY55 z^PD`Tj3;GF2z3boyI!sRTX5q+kYtG485kH42@$Z$gW#0`FOZW)sgy|=9sT0B1aV4= zUQkGKZ^qNM*1p6te{}pO;KNo)w0BS(5h!&_PhbCYIg^2je`TdjiJtVoLP8OFdH1QP z?d+HPse5BNbDgcRk@{+}uBTE?*cP8Xd?xX%e(!FS#l$s`4(IARZl&-_MfyNL24lMB zswV)G9vy2Ij-6Z3eEhpt__oHC_UDX#h&RTE1kJ~C-*2)RMnHQ-_kq|YF~t2UN}n=~ z+O5J!59sWg^%HvI$Vc|^3)1VITfg4vPmSqUXNFS-9|z|#6gZ&ly#N{R0};0mK|yz* z-S!wnSl7U%5Lz`*J$nKXhr{dFZE$3O3C{l*^1-vx&>#Y-7sT50z^8(DSR};4jt6V% z2!6@S+X?-0B32y^+n)l6Ea4l`8sn{7fBS_q4PRO?2nZw&qe8Lu>yJOArgrzl@CS!A zh`;>f+}1t-QeZy-5#yMJmC7>77r#x<|9Ke>vROVp6ekx~TbCqFAu9W2rb_;E=^ilY z35RlNaHOxCjSXH|nRK2S6MVGbad{VlN@i70(0 zqUq$Vtcq+h>dPwptVTN=Bm%K|Eq+8Q<_3UYW!txJpE z3uW}z+p~{A7z&Nw961f5t(+W*0<~Bs^}C?gvazv2>V;50Jw87E1)L)k5uDdXqFCoK z-lOBcxbhKj!%4%m0W%7ac@#Gf2+Tb}seq9dHB#&XE1=)MDex)NzZ?2K`j?S0H8z&z z?p-w+x)6@?tOXM&q<=0eYiZ5ESnQqrwY2o)#V29d0Bh^wa%Bi_H@+JAwTYRN)AmDp zS;r}Y+)q)=zqILH+N1QV`Y)dDKWDyiyV-L;PHC2s3gva(TY9=Rr#Sz+^9wv)GCDd$ zlanV}W;rUM1PTeSp|J4}2)2ugS?wLlI(vFZ*-K?c3Krjg)OFX>PaU1YQWde@#LU;Wrfw~CGyCeW4U&@aw_ROOvS?G4#GjK%N=m8~uRR|vh^TzE zelWDXKBL=S%Jeabz2D6xk|}D>+oUK z3{}w2F?gg^Az62_h#n-di=85dz1?(=(ida9F}ITR;+Yu+aq3UKm05i~Bb_>xG}UId zgZ1`svJW{*Vpu2UG0zR4t1@AEavYRe_~$@bNFrA;j1rreEhs3s__b#2K^jDPB^~L$ zOx(>*C3rou_c?ED%>}9#J~nv7MsctftW%0j!B8wwgN_||vNxZb-qQZmlJ^u;gH&bG z`GG>KdbH8RutT=xv+2@_W=H>4)}jy=($OZb|GqiRVSxjtWf4>~o$X)mtc@t!_DL@@ zMTxYZ>`}=&{+3wzscp#{Al@1B!sMoA3A_n^PoIC2cZQey9V`u<@cCa$XbJ4h+%?~c z;-9Bw{!OV;rcUIOhhOn8EOaViH`&nIQF8tLkCqNoahJWlqhF(ET#~MkX7C?I(bMO# z^3xSkKl@_yuw7jjU2yB=+yq#({*8F}N3hVt!8K6Wwc}|;+~L&yn_Mg`Q6feQl3Haq z;@Jp|H6Mcl4!H?#L^`MrzPFmbE>;wN)Uv((Dh7H$|%f^Pk@5r>z6(^_^V zX?w>Exv{Z?uV(OzuQ&|)q&~;umb3xVeaTeAhQSMW;OA*6;$$``Ha32J*@oAut*s08 z3>+_IhWpj3yi@%OpJbJfPo|JlPEOw6FRovmO8L#np3#x5R-?|@G8ZknrX~kxRE7~w zoL^TsK5wCJrIJp#QPzkyd|%OceJEKDOFY1J!^xP7yFPRB6T1e)30w`)?(Rwi(rRj! zZP6rm_Q@xu7Jd(mjn&%S1w&h9x>s%gphjac3e^2{YhpDrSSrjzqrGw!-XxDDq>owj5hIcskn>GJbrVQb8nW0PP2P8!C zvCoZ--@iRuV^*e;&m@;AcVuOFlkxOfA{bo6X{f%2-)^w-oatG1mJWW3!W*}>8o`mK z#oJV_d)Z8QlrCsBGsnGySiDR3!Bf|1Ym3#O zDyt#J>i$vZO}5leD22254Y`7aUjVdQx+>H;#@!c*q(HyPZx+TNNUt0p{aa5eGT<(u zMC6O$a)z>{KmF>)f5CnvuZ71Ub4Z3pi7REj$vac*@8M=nmR#j?6c}L?IwkXcxAx*s>3Z-S;(=+uE`4G{1 zVi~EDvfUj~anI9GpIvQzn#zSn`V_^2Q=>L2vp*&#TDbNh_w(xxcHr0NgHy7Zo{5P; z;|(IF&UrEWPKn%7BPAtD;+DM8#74%MGrW+<;rTs5;e8on({CA2ME+fQMGw<*`LrFI zYJ}CbxIQ#L|7V>HO=+L+6``uVfOE~$tIO`BtuS%ZP7;iQVZ)g=x8w%X4UF_p{t+$O4@cRt`YAd zOweQQ6+9dB@t)Wf#&$EdhK5XG)H#`@sb_1WKPbOzNK;&EX>sdE!y;GM)lU zsL_0yFDTRxml~d4#=EPlnNjahs394H^zU+7b$DR^Vwb3!`6W*+Grf?HvI*rFxAN#) zLgpgP&|bor613aK7w8j-gtTES((PudTBg6sx( z(zxj8Z?|R+&dy7+Gq(GAc?fK5I{MW!DH)<9=u-i0S!@#%YUmGquBidxG10wy zH`k~xF?xD3jp{|CKV0jMXkAWcF8(tYb-3Ov;=^K4RkxMxcnc~5plJUMYP3HP6YDj& zMS**P{ne%SZaU+tk)81qOh-or=Z)i^0z^baY6WWO{QUfoMEu>~&ldMX1ETLXH8u6C z3jx{y`H!DWq-K~T|NatZ%2k~E4MA6C)44XTao6M}O zr8`4hAmaWtuS~(uPYjr&N=ZspmoJ*U;}M%$QC?-pIGFr(;7Uwa%P^m?5BXdOyKaZv zc39Qpl>__=jGoN_u6ZC}{|4$BpzCq4w{Q9O?H&+y9)}y!(8$PF%D4epk$`}}3mcoT zsw&=`oE)f+K?E+Zp+N+_F9;?PzeR9bZikBVM4cl&WClo03%na}Ayt4<5|~wUga3;1 zsph968v1tFkBt4xg}At0Pt>p{KMgE-y)oeo*g)ieBX}fqEYzS-EBN#HWVc#Cc>34M ze|(o9OoRFy8kjHOLyN%5iZ3|W61dqXUS3>fWs$Y7Y2S_(QbUIT7fO5o4WsG$K7JW0 zN8OGu-{8plzgU2Hv);=a27a{y7p%nhDX@Sv-?*7tX;`YDmjZ{0OswOh*MIIHg)z7d zcmkAxPPlRNCJCR-edsW_p`MvoS_Uu9Y4d=3x_fwduWq{sazLgss4f|plq+tTuVR7^|(U%!$exdyK_6{C9Z`;4;X`JscV7 zsP`b2y|gk!lb#zN>%kjJUo|ry%VvZ0W49mmYU-RTlNGrI;K|xa@?-%jz6Cy~tMqZ; z9Di2{?CUgnUrq6hf+KXkGb>oV766-)2i@HqCf(|yUa&KTAK@PbwhUw6BmDW<-8lAoVn02xpr@YZUuwhEyBmJgQZ z#g#?$U@lz|-bF`OCL|zWVBJKmggEvMXy&J+s1*o0@^GCy{%kl= z;MB;4&DozH8~$^8G>_9($(%!UZOGpQ)L;^^5FMhM1g z%HJ;c2lvV)dwq&Il;tKMK;kjqPf*<~P{{{VKP>rVo($O9Qv@9YV1X$t6E9XkKKt2j zPSoe>!WHow1`#4uit~obog!XMe^RCI3%giR7J}NKY1?}xkl7-2GEn>F4J#aI%gKeU zPF8?HDn2X|+=cEyE{h*3sS}-D-B0UYXF61g;!?1=h>D7?QR+^y_r1On{j(^&eA-Jx zOFIZ&naF|%SuR)vwA|yK+rI@H`RUR206ddBySpGu1}A_SSD9}^B*rH517f_Y9$SBU z?oU;oM69d`@Yx&(<*R;aQW+~PF?#i?wbD`_{T^8lN)`acJzo&R$|}o`mp<)F4v}$V zt+pe6Xyj~o6niMU2f=}X^~jH{29HgItau9b7;r&ENO15qTfHz{e$pGy3ciQBN#LXf z5a7#>Alw1{JM6(5Gt9mHuxe)=T(?9Nw`au`HuZyNzI20It9~OsLr}UQCe%1XbIosg z92tBq(I+Mt#v{kv+6s}s(#g(#tQK24SD=u6F@%-C9{T#@RMT=nP5%KvV+}i9WKbJ& z+?e3>^7f94&vpUxh5O)H1D<#+hD|9=-e=KZ*HX#y473>M7o(oRz89wmAq#t2rYC}H>2fR(cet7up4yHQY>YrWH3&)Z`EO8%E9=nnzPSnK^1-$t=#w)QJ z=wpOOMlOSwZ{`#KyRZW*DH~en6Gp*iwVQr*9tgHk+~AaxDy^XW?&j^0FV-`4dm>O< zT+WKr;kMRLl#|=vrBP<&U_iJ4cL8Pg}6Sr8*i1k2eE*akJ?7wd& zI6feH76w%^L>mC#YGLJr;$2YbBmE-8#~#2a=ova=J;0g&)fFBpreS481RfOG&>8-o zqP^=e)|WgA5SlfIafi&%P~-bC~dx!0qdc-_^dl%JBEnsVH(I|^Q|b$P`}%wuCqe!yOIDsCW?tYFD;qO zyN8c&^3HGWA%s)x%|G+v1lbMIG&L{k0~}XA)Y9ii>}gmwSK2j~=;8W`(Pq+mEa-vT zFmMn&fCcO;)e5^n@fg5{OmHZGa6<_i6QG&t6W(rUhf|$L^oqUt{0Vpr0!SI&wLC;S z;ymlIHo^++W-d<`yWV(p!||=Fv*xSzuV3%LB7{D^TJ{mt_97k#wt<7BgR^rd$Y{WX z8}#8_P?hEJ5MBK9vTtLu5gk4F_ji)Mz`(4m19lp(zn?t%b)9>B80(fEe>q&=HQnLJ z?KohE*6lrFHW~FMdc z#RS80_^NDYR1Rk|t82Y=-@A^?>p^H2*6b@k>+!Ad*zZv%7)UDTs{uw^`gI#%le?gI zSb&xR5MEI!DRN*J1vg{V^5#0?dtOYMj`H@jJ3lYrHt8Y?@4wmhqpr@wc!X^4Pzlu1(ZK^V z6!=s?9K8&l+2hCO@O5{?Xcg#FNG~|9-cVM~v@vivdy^*Q90T=eI)xE?qu-h>BO|dN zKH$Ky8tU(V3%Gz65HA8Yw+j(xbZYS=_h2x-Fb;|P)2tqOOH2C$CP=Z$7)KOrOBl3N zescThR~pKc3ci{wRn3jnb@Z6mJKC6Rhb0RwiKDpq8!f3ZjL7bReuZKE=cP*1 z=FH5;`OF<~W#h%Vfk3To3HgY#fdkj~?{W~mSE^Vdtt!Nd4>};$UTi2qZ&FeohS~do zp8(pBrAWz}O=bhP?p>ZeCAZ)2^ZE*@$!e$^PI+J~ z!nsm)(**mgQbGCY(vSSlT78^Z{|l*jNHsH&4JO14soU=xON;lHw>KA}eT1{P=oIufSmb z#~|Szu>@C4u=GyXV88_v;(iat#t6>~cH;Ta8H32n2%d?TW@b%)AITIWH-%5%F{gmv zM-=i7SSJ{JgSgh7UtI7C4M0C&6>R>XeMBWBlnkmC4gg=F$J&0pvv75A0U4f2+k12j za-molRb{QVK8&0>5E08+?=gyd)LW=){3P#yt^hRYTSnFQF8YUthVFA310KC|3kk6R z(ElF;5G)Fj*?uhcpyr93>}bc zhg8J{aAO0riz=bq>blp@)D9W9@PfkSfmeL3Q#YQRlJXrHh6P6r;s^pB#NayV@%ua!GHR(9^V}3ZFX9-d%GjnW{8| zC;{vp0>Ir;$Ymo45`um1q<`x>ltE2p#wa^WV9 zLqk}hfDb?)qSIMxczD=-y|^Y%H5Usuw65%0&TP$&!NI7G4vFIa{8zR=apqIkI&IWq zVq+s38(l(nb+xp99486n)zt7quJj8msDYbo{_AaKW(Ffi_FzjIhLJ~2r)$iI8 zJpux;gU<)X7rLJf?*BIPu#RaEaX2V++58=z#d>xNj0JqJ{eXaDxvAQu8%y+Jf0(#Q zv4=O8@hmQ#z5jb$SUj+5tRnQVbSfp60Y+RZENyC=o+k73JfrWtc6Zy$^yN#Dqcmt$ z!ElRb@bI62d2!X2)^!*g_FPf33B8&wIQ$kdF(4Ff3(%r}VWj+BJR~S9YvEqZRLW(E zBxL>6DhIET;rUU`=oG|E5%54kQ- z64x94TJ?c42IzS@8k&EGbFJ#(+y-IP^YArRSe6JVS^OPEu(JbQ%bo7BiV7ORlTK;! zH7F>Y_+J^UsHKJ|?RNjve{mBE1261KFK;rT+8s-u>ZQ1`Zq*ORUvT}O z0A(mImW5rPWiLGM5Bqi2N0iTgJd<2bwKfu1grQudAF2PJC`yBPBYyDlW;1B`3J#0u zEYE4({{DKa@kBue$}9c-os`|sL4wr2lQQoP%yoIBd3O(-N03Y$p0VBpcI==61=wzV z=kLQ@lxsh9N(X>2s1hDO_quQ@Iob*y|6L;dYNGTBjJ-l@0n_mGv*gG~Y;YGubFxOR z^_gUd$sO8tt@Q@SV*M|C@S#H*A!*_WCNVho?>~R?=zy$fL)WRNsxLeJ*3X6euZS1Gw_X^OZeq@M&$A zqV(>7!W7H{Sq2Tk{`MRtjQBwY_APsk7iqUcdWTHrfVBH(gL@48UWR)R0k&u+MqU|%39vU8vQP^JBO>Jnn(Vy0+dfsaA*l7L|?Bb2g z&AWls9q0%~__hpqFkxs>1!QG9BI-qlu*iOcWz!-Ur-G;z5B!-yv^fbge!xEVH{33% zSm{lH|IKcGFDf&is8QUw+%JC7TtAjly+QmYH1wXbvNDnpgXPnGa1cE|KYuPGgZ#2u zzRIm1smK}!v?cS6M4^Ti`C;5(=#nDX$(q6U2NrmbO{AX!)8M_zn`|EX%6k3t)tuYu zR`$b~DCKkVf8fgU(ffoCZTBNsmOy?h08>#mL|;F3Y1)CQu9k&rwrd{0^{hwo#Nn;4 zb}WmsaY3X810lxxC1X2A)P4%9-G)AQbbS0XtqJJ^42x@EdG!v+Mvp@^J3QH!*>_6U zOkO-owN{uaT^`K75VC*FPqFg<24#|VkEm5%soVy-1|Y%#*SSp^YHF!Rerucvl6ZBY zfQD%m5Hq|!7wLt2b|@alq?8q)6F7PoC6jO0_qNh-Ad~UTc{RFL5_J#T2{Hpv)+<1j z0W!$2uIY!XFeoLeNUts$=n5te%;&mV+QB}b){OU8YQBE`YIf;mxdMpPGZ4aON#-|y zKEJ&9krO@zFK^l##G6~v9|d(!V)?03@3WS%>f={8M&Hf~Xug5y78qiIVjk*ob%+(* zAWsLEOiU;pK=P(x@ASU8@N2$*xoPq7?zesfY=T)&`F1ZJEliY=u^4#00gmj~uTQgQ z#Uvz|8yRfxmkk2TO*@mygecb_LvFa3YNphwWbmPK>r z7#FCB*=tDkP(5m$)Q)|u#t)Y3t-ve*WVv^|vsaac87CDvv^s8w3rg(oNyAdqjvJHI zTh$sxc~SGc5#Q#jct#qx;QmrBguHb`Fsf{e4>Jt!H9D4DgB<{w`vgv7@+SHl&ggM6 zNL~Z7G(#=02ZgCxGO|NVqlKX~x11@}C;va7mS075Yn}vRk&@^zs}<0cyza30)L2|; zm|SKE|GwD!iJ2e&V5kl>m=!P|44j!CBZ}x6+ti_G9!U_I!RBq=`tBBzC_q7giB)=i zq=*qumS^yAu(LD%!v|a%TGVje9`?_A)7s55+gY#Y%l#0Gy)3t#xoyRMU-@e|nf(cu z(+1pl)jJ@qoG#bd<-=Gv6X+)D35A@8Qs2=6(|H{Pbe*sPlL)@1fkaj=k>jnN^HTr% zHGusyVY>mPV+F{G=u!7&NqMb9u)p(SE>b{>3kI)}Q1cNF#M+yvSdKQMQ~5CSg?%Wa z-D_im1%WL`3*ts6^q}2&_}Z=^ql~fgNwH3{uH%qTenPDP_@xMF>WkaKHbUP5>2Wz| z)_g$Z2-Hl;Xy!>W&Ho*k+&@t8BmG>CmoZ;q&dV=V_j(LsYjE#hg9i{VM`1=nBmR=? z3v@(s2E*<#&YsC-})Fie1Wcs{H2uf@n)o{+=ALK@2)#O zul)c(gz^n}L)o~)!eg76yRW9-`J1WSF+fQ5YcSFZW=Da%m}lvGk{_scK<`Q=CT3`9 z`Rq4@CGZ7ZhigDABw-Zf0L%xd8cKaanP*5@`J?LI8}Puz#pR5ucV^~((Nc==a(l}r zRor!?0uV1eX7lQmaD=WoC%h)7gGa0j_Qcyfq=+yg1g zsTFF-KN3rfhwe-bG|`}ck_(}Q)kohEhIu{3RF&xurSdvDeBe4^e0C@{30=4SeVYO` z2k;LiJwDawZqK>_VXKxlVJU|@{G4V94GuZEl$sg_xE$6(M-4FM;rgoEzywB)6+dE7 zl{`ViO83PAit1o}jf@+b7a*lkBH%`$dpaF|zT;@v%vSQAF&K_@d_o`(sV2(|9vy@i zqMZ?16^IJfN5T+ZI1c{#=O1J`B%5As3#?0+r1JuHYY6nO|N8aoO<^H3)TY!*^hls$ z2cHa#;O!n7!UL8N&P!;yQ3Fc|MGBZSdYf909;#ccCjh3t~{( z0)Xf&htY^w-kcq^_DE~9YG^Dut^R(Rz$OYh7zY?c27o2hsZs#}huO3*UcQuA?8QyXc*fgJhF38|TS8D@8i znNue#5_WcWs4U%wv*a4o17L`78fd~_Uz|F_AO{3{hG>x*+~*;+hbgIGQq$Vo8v-7# zaF77xi3x*6;Pbl$q&yVAcA&Wo2_sZmQ>raS?|%O-aRZbA48=>$|3C4*sq4R1j_*TT z+{T8*-kt%PB7EQ#k8^(|;^W7AwziA;DxKoFWW0c`YnHaneU$RcP-Ap(-4(l1o~;uN ztu(|TWg1Ii^Wl-Hbo3^Is2$p=ra2`MDmh`#ZB7S#oxZ_O!BY$JAeE{D>Q~cE4L>Z6 zIv8mrWZQV2Tjb@fPt}$U$&3u>+O@t%&vdV6TPBU?IdfhL%lm{X#CAeU{XxSiGF5f9 ztuGV2g+qkqeY&!Qm04S9eLFutGc`%VmBH)N-kz#XPiPdN1)5IVSlATLpXSP@h!#%^ z2mMyb3V0qrS*r|)K`uHbz-`V)ZxsMhGf@7*=jI80Tm*7ZsrCDNpso|Vv@-a#NRWhc z5K|!)kK||l`C|lA*aoY&Tesln-rPZ7-^F@DzQ4s<;79%lh!OOl+x1qXpOmRlaSaau z$MKLFNCRRvmE>TM!-u)4QkoVNdwyD&C&)5L z0icPIM=t>?jsVkriD^)`Kn*wbwaP=rpY6%e(#kFqwNuCN@KkWH4?u!SIhd z$18`elvPk z!JUTd)<1AnE67!Oik{<8Ji?PS%+!u&^9M~-sY7jbzM&xvkM|xxEEwq%TEIk#UZ^#5 z4gZJViDPQ@+-@z>2A3Vc9%=cBm%ihYv=K5f6id1{o#P#D`9BSe)i9p;o`$KQK=lNr z2=BsqhfaZ@^IWq?Nhf$7Xn!2y+a}#ifIeD`%DiVZ?^lC=j{fj(ChbDEUtQghl>sJ# zm5DF*a@c>GXzb0zTchXK-1s*D<1O@xG_r)fPEcPp#9m7PV%f7X`NEu@O7%1Va3nvY z-Iorc6;^R@;gN*Q9osJFZm75wBD*H^zU1IQpx=UUqXIh+fIWSnALHb1@6J^q8wzzp1D}E`D6imqUzq#z-^O9he{qS`c&?mOH0Pf^{-JP zx0$hkD4MF`a4pG0F`t;jRT~+(^DZCs^x#J2e){*KplhEh8zJrn;j;sI^Hp z)}V2et-kW{i?)9d4Hxez9PYovd{;jG=>QNTyJk61gP=h0e1)cdK=lwdAe;R;>G*spoj-$L9>V zUNVqny?MRz!Gew5os%gJl)Qy>V`&c`rWR&PaF~WLY+Y@Ap~BbLZT_aJ0JpE`0}%!xwxlE=B^%)bVZ;Ta*V6+WLRzbMnahOL;m&Qd1FH+` zP1HBJbSwjd-&To5t{2VFf5OAcRV2oy3V`Q48V{0=ycl6`A@Dz~B%OIk^@Kn)kso_) zR27~$<$~CiA*c2DqWgzDmX;uG__fVm@P>p6Zcc`PS_(QYR3hhp;dWx_8KvL*eR0BF zJfm65HIsMPB7K1Ikslr?e&D}hQ;5RD$48A?KtxPS8!_jDuibI;cKn8%Lfl<6Y@$-G zRmloCg(z0gumh%RU|F&>U$MFDHD8!b^!*D@RII?p=Chf3{Vx)Uwb@*rd^Xc`Yqy03 z7>c|8p6p23zkcU)A%Qs){WaY;WM$AiUA#L&rf`r2xk{Sr*E4-qJAxsw9kQx~Sp&aq z=YQ7ysLUU-l0nnZpkncwzY#`?swCZviT!8hi(jN-kA>~O@FjHYPMTAx9rX*-7Do5? zeau{cKG&2f&@ACuTh|&wn2GBqeYcaCAZS2a0n29Mh1&(Y~RNGSIu(vc$?9Mt{CW5995Gvcn!aua%k-tC2;H+@Xa`LcnK^!KL0G zvZI7_95YRrANk$_02v~~Hk{l3(Jo{~{K>l^D;`-3hVMz#y^*B9y~h%er=>%+n6yZj zKCESb6>j>0YHnLscxIyHXaSr?llRF&tr?)MlxiaxFciYm9*m!f+aX06ym1~4my3rE zl_$6IG(P#1U=q^xv0#Iw*4E7H^%CwI8xmYIeIH?D%Y58ogS+ZaM!Ufq$OgqbB?W8f zj~(ov4hs?wcL0&s$P%TZ>evEJCRiw=MxUqUNMbr*)tN^csWZt)<3?2J2|A2^8&R`- zHkJF&FFI3gFLfi8kWy`;fs;jC6JW-{1Uy=mbJePi!xw$F;vVJYH8@`Jv6kYFv{wg_}h?L z0rP8E6b*rpGXeKEF|GUiw{fWdvz?FmfXM`6Ddk3R%yw}ppepv)ZjG0;t_)^!D<`mZ zQgVY+OCYu?WUb+#zkqhF&ba zEINJr&f{jE-~n%N=!gy>+yq~Q*7htB5TYC(tD*D+*Qr*Y%ed}%2MhI31S zw;zZEc$YWz0sc3K+#rMpTseZ@*A?rU;vS825f1ER6ur9&$!Fe4%~V6K+Q%a`vV@wf)L2GrlP zbIf8A6T2?X7(2S@@yX7D!0i*<>!O8SDKb>@^Yo{aKruAbP{+)w>+!LF@UH`=YJ^C7$TNr08yENNK0MZ~waNRsRlG^*m zejD+&|ButW^^ZzR)~V`)Oyg%~#8&Bosx;q=4KQC#TOAXlZo?KE)$m>>P9mwrtnZU9 z{|=9>E!O0uJ2cNt*T)OgluJ8Qj7qNTfSc5%u8V2;J?&$ybo64~i$0|6l&OLbLa zW701!`Y#}14-Tpgsj9l=eR>=fJrwXPlx6Y@@%ecrlQcC9Jp7TXNEu?B1D(oSk1Z_n za!f5#DtXG50H_Qjb&iG6FObSdg0v7Zqy%mM&R?acTrJEn{BdBueSD&9K@rhgf}|Yr zE`S0QmxYou1d2Iwg9S9<8IZ9v0c_vX{A(lS`FM%BR*fw?j2gfv7CL z!Rc(J2}T8k!)gVw=&ZW+!{sPpZu7$z%l&(ZfPQCzSgEFj5|gwxOJ$UK_oOI;8riDw zKmu#N^xgi+69pIzDd=;YK@5Vx7dAz@UGTIb#N%G;ZPv-kRi3@&Z8{EnN~jDhg|Z91 zu)BKKZXB!t5=Z03-mLFQ6@Cp3UI7@E{hy7t^J!x=Q)8J-pX4eWfYqkx@<2D2>y|IL zxe>x7wWK6&Po-ubLKH1i1nlrV+>ri*;~6+z&O;`R2Ljdc5=^K5d{J;r;sl&26ULr` zbE_rDo&l~FOA@I=P_KC5yX4E~Ct6*R*o&ZR!yunZi4?QVa#T2Y=H{tse6srxRHO+Y zVjnD9@PdKh%W%=6J@gF0Uq9O6^{9$?#P&mBHi_e5tU)6wQli|NAzN!O@g@c8>c8Uc zf8dXf3Ta`=I`PKHl05J0iQxnSksP)_n~A@;s<|%Ss3JpsaKwcM!Hrrae2gvsR${^zQxUglAwl(AX5-crbzN!2J z`y(FmMelE2aL>-h0q@EJUN3+R@|~YsefB)k5_!b@Jgva<$GLe9TK^fS?CkPxae4zDaL6%#z&`s;fZ=j6z~R#83s-dkSXMFNPsl6xiPS~ z*vEe%&H^d?=PI-Uy@*S3nJ-Rv4On4LFSlP;HLlA> z$}>k4-E%=48)sHZ=pQYVt#ELH(OM-i_$)$jI0@wUI_mwcpM)j;QN}MGy&qLsWyQm3 zW#3+_M{!X9$RYTN9u=?cD}wNU^IEQ9ef!*Z(Oy_%DQ}gWBq*@weX)!YI46}xxwn|I zCpCKZS|FOwXxghR_?-`Mg+r;reR4_VFfZf9(!f>KkVBYl>pOzXtec4< z?&PH58mj_kCSV{Cn=l@oekJ_#=lAuKh4=48zkfUusjKq@D_mXF!u=EiO{4f(pEE~z zQ>}WQiztupl7=j-Up^%8V}<7=xz3*G!Rr{ots;&IouR6}p93rNzkR*mQ8936GF3T{ zS8Ass6d^9{Kxno+l5b5wkOB{ynuy5$IKCT9KGf3EdSPVrHa&grDS4JgA>!QwGtQxg zWn^tFYj4ki6biGmCF~|CI=+32^1r7#*>D2JJFE$TnE6#zsgo5o&|Sx;p=JC+{4v@Q z>(|ARD$Gk&%4gJx)&}JkBcVg=C3#jwfVM5#@jXQpaG&o4OVY^ z%LA(V`h8IB1zgxX2+Ez%uJY(R9*_)MkyRU6fU!#oei0^HV?}~8rl#Z-X5nf=A-^5_ zCnqCThtrJ?*4ks^@-cc@A=qYVvam@M`_eQDOkR6p4+rsC0W`Vs@C=R^UkPwK^j zdTwWAq`_yy0RA|JR8&IUlDW`3@%Xh4CI&!Cy*}ABbrMPy|9DU0*)6c|Ky&<+E3kUq@MjK)H79e z6z61IyNaIwWUX7-yVFy;01VFlv_vpur(tA7H#axm*w{dTdaw&xd`j+V*S=i?faM3= zZ88yo#QJ(kHvIygUbm&}+T**5k4C>Sn5b)N?oC;j;@-a>1c=taKqQcxW#DRyg(;$# z@MJ-aenl#>5x5S-u@?HDV3IKUOZ)nhr``_sN=XN7bOB1L!!1?TqY@IwWL`zRy)snP z)G+z{rn|eln!38f+6W_JKnZ3YfMXoDn#3hK!nEtl6cP7Piv^MxST20My(7nGo}`O) zWA*hyK38XR_+(_EFf-~V8paEVGb$@9Kfn}Kzizlih#HYmvS3re@7C`L>*_~EZlHAO ztlAT8ZA_umh?d8Sevxr8F;6Wm8Q}tunVe9i1vta~Y_kT6+~=(evB{3tu3tCMYc?<$ z;S7I9#DiXup~3%a%_=4598BmWqT0oz@bFx={zWZ3;3_U+Bt#;plckdXOn7H(Q_$uj6Tf}m+IKH+! zd-8NZI8FxqsJQ$3`T$#7&WKpWaO_Xij0uxRUfI_6P)*Z1j4NI;>m)(rH8jT;yTZw! zBka2!{THw!=qUogxbYaJLP9&|2S1u!yEfU_W)$Ym56w52#W8ijzJ0Jgm%cijJ9p)} zoaBf}C%pV84PN@;L($my*_;gV(8fk1F(oiTLmZN!SpZWB!+=x%J3V(v1d4y~iQn>_ z0k}62jCER`8uoMl6D}!hX-Sxo5nw3&O5w&05#{`PP`;Y(ubEDyZ^D#90jCw5;atV; z*4DS+3j5PgOH*0dp}E#2Uhua4;f6Cj#a9=^qVN8ES5FN8`nB8AdL0G`ucMt@9+4g; z#Kt0~d4TSMEq*I-hwuu&fMbL`$$c$9cZ(7z)fXRF#74&r4YL{>{jT4n&=d-hF00;> z(Mn7Q4I3<iB(*7QwXxlbB%_^ zRQH|E`?J2j*x})WzP;A}{q<1wz1Cor_t+t94_tr?xI> zsUje?=iMzvHI1>oSx@1(h|I(QG}h9lQxd=1fgDz9zHr9JB4@mT7iR!2_36%9VLHG9 zNZi2;$AO2Yn|NJP6?Fk+x3^O+_5B6CmAh5O0k!-i8U zQK`t}@wNGy*{R;QHw!{u<}rRed$;fkVyZF>V(QH7d?u@NX@e}7t$i+$s*pO(hU{VZtM zSjs}tgAgJ8zM7Z@A2J?*2Ay{ILW3d=JKo-m+|u4?@?M4``ym-W(O$P$1U0`ai;K&c zOgG-uAAjP^$;LBYhzWxu4JB;1W~HhhExXRC$0XH-Xc}m@m--O)Z_SjFc=3PgNABSY zidEMFv6p|88oF|EiBfSp5}FUhGm@`o#Kr2-Q=8BxB^AO{U;04ofj=k9)Ugq?J`(ny z`MJTweZi_m3NR`%6RACzsyzwzk&aW@=wOcN2yYNwV%OUGU$$-ET6SWBmGc zG)QDWiu>(@<5X6clcyqj#%)DWlC~24hoIR_L&+XRr<^~`$Y^@`vV+5F1i!YPX?pT` zvF(fL>S2hL!(n|2&VhX9_vFPq!Vm1vY^yfJgP# zdU(8W_B>e%yc_r!Fp$p7+dFs0424OP4oRA=;lI0Ur-Z6^<<424be4TR9#~jJhiGZL z^;R_jV;{I#EN=?Wp%1|1eB!L^={1qcH+O8Dao$e*(c*qSL6Ik}K|vOsowc0Y)n^`5 zA7RQciRzR6ZN0nf@6^53=L5s911H)IPESjnFyn@}wzhY3dc_qFVDeJu;D7H|Q6W|Q ztmn~z#@(#%_I@uj0uF8g>x|u7BT}9`1`fRRP7sinkqNQSw&`^{z0`Xuu)p0btnQ_$ zwd>5+*QUVq3G~$2`TwRkIyvRPd0T(aV$tVMUrJJddl-CXPCC#jy!6ejui?P{k0&tP z=FG|I=;Bh)(rVaO`(86p8E@UP($L*|_Gq{09J|`yM~}3DJ2WI^WvzhC*psKK zW~I-6>;C;+Uez!8S!$Z=oc^!_-J+uYUEOl0eN?Wrx_{i#6)%ijUGIY`faGLu;KJmR z_wSA+_wNKYrJANs2i{7^XJL6W3D}XDJXx3F>sMc3ALG^Q*(=sv11=ts)zZq+)D8{~ zTjsX>a$^4aMfLyXfYlE0rdJP_7JIF!e}2uHtQV`((Z>foQ>tNSv3udiB-Z2o@ymAn zFj^fh|M1yaD~6buHyk`)j$FRnnRhql!-pN#&)2Noos^y3y0tW1N@~lNt)&YtW?ame zrKukt99r7`=~EQ&c1YLkY-`|gV2TzuW;Zf71ACPkz$#^y>usmniTC{!>(r*M(%!hy z@yIbY#={q1mH=->=AEt=TJSPR)jaP?P+;KksoL9t#U!u;w`}p_Jj2%Axe~ieHUjsq zvYDG#+t>mZj-77bu>-hc^V7m`{rIXc1;#(!o<9Q4(|=VpxiXzocpl5Ud-eMZ9=@Bi zyJ~A!^!8Vlw_U!mV(Hecvenh1vAd%lJy>w);zc%j`Sd+|WH`A$ zD{Gtpp4L~x$@$UjCGh+s-?}2F7c+qynQW_fUEaLh`n-+svJ#m@HDF6r(nP}}>{Xf2 zCyhP<&<`vG=5OoI3k(zl9*1ujAf+fb4_L+v0590^au-lLaQ^)Jh0lY4 z`w|;3a}-aUG|B1vJNx{0P42mV%P$AZfvh_qw(~g&)&t8&GF|?rp7B$UVyg4$U}*** N@O1TaS?83{1OUm0Kpp@9 literal 0 HcmV?d00001 diff --git a/book/interview-questions/course-schedule.js b/book/interview-questions/course-schedule.js new file mode 100644 index 00000000..c3e8b354 --- /dev/null +++ b/book/interview-questions/course-schedule.js @@ -0,0 +1,61 @@ +// tag::description[] +/** + * Check if you can finish all courses with their prerequisites. + * @param {number} n - The number of courses + * @param {[number, number][]} prerequisites - Array of courses pairs. + * E.g. [[200, 101]], to take course 202 you need course 101 first. + * @returns {boolean} - True = can finish all courses, False otherwise + */ +function canFinish(n, prerequisites) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const graph = new Map(Array(n).fill().map((_, i) => ([i, []]))); + prerequisites.forEach(([u, v]) => graph.get(v).push(u)); + + const seen = []; + const hasCycle = (node) => { + if (seen[node] === 1) return true; // if visiting, it's a cycle! + if (seen[node] === 2) return false; // if visited, skip it. + + seen[node] = 1; // mark as visiting. + for (const adj of graph.get(node)) if (hasCycle(adj)) return true; + seen[node] = 2; // mark as visited. + return false; + }; + + for (let i = 0; i < n; i++) if (hasCycle(i)) return false; + return true; + // end::solution[] + // tag::description[] +} +// end::description[] + + +// tag::brute1[] +function canFinishBrute1(n, prerequisites) { + const graph = new Map(); // inialize adjacency list as map of arrays + for (let i = 0; i < n; i++) graph.set(i, []); // build nodes + prerequisites.forEach(([u, v]) => graph.get(v).push(u)); // edges + + const hasCycles = (node, parent = node, seen = []) => { + for (const next of graph.get(node)) { + if (next === parent) return true; + if (seen[next]) continue; + seen[next] = true; + if (hasCycles(next, parent, seen)) return true; + } + return false; + }; + + for (let i = 0; i < n; i++) { + if (hasCycles(i)) return false; + } + + return true; +} +// end::brute1[] + +module.exports = { canFinish, canFinishBrute1 }; diff --git a/book/interview-questions/course-schedule.spec.js b/book/interview-questions/course-schedule.spec.js new file mode 100644 index 00000000..61bb9a5f --- /dev/null +++ b/book/interview-questions/course-schedule.spec.js @@ -0,0 +1,54 @@ +const { canFinish, canFinishBrute1 } = require('./course-schedule'); +// const { } = require('../../src/index'); + +[canFinish, canFinishBrute1].forEach((fn) => { + describe(`TOPIC: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = []; + const expected = true; + expect(fn(0, actual)).toEqual(expected); + }); + + it('should work basic case', () => { + const actual = [[1, 0]]; + const courses = 2; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('should detect cycle', () => { + const actual = [[0, 1], [1, 0]]; + const courses = 2; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('multiple links to a node without cycle', () => { + const actual = [[2, 1], [1, 0], [2, 0]]; + const courses = 3; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('multiple links to a node without cycle (different order)', () => { + const actual = [[2, 0], [1, 0], [2, 1]]; + const courses = 3; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('indirect cycle', () => { + const actual = [[1, 0], [2, 1], [0, 2]]; + const courses = 3; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('indirect cycle with nodes without indegrees', () => { + const actual = [[1, 0], [2, 1], [3, 2], [1, 3]]; + const courses = 4; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/critical-connections-in-a-network.js b/book/interview-questions/critical-connections-in-a-network.js new file mode 100644 index 00000000..bd7bfe37 --- /dev/null +++ b/book/interview-questions/critical-connections-in-a-network.js @@ -0,0 +1,76 @@ +const { Queue } = require('../../src/index'); + +// tag::description[] +function criticalConnections(n, connections) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const critical = []; + const graph = new Map(Array(n).fill(0).map((_, i) => [i, []])); + connections.forEach(([u, v]) => { + graph.get(u).push(v); + graph.get(v).push(u); + }); + + const dfs = (node, parent = null, depth = 0, group = []) => { + group[node] = depth; + for (const adj of (graph.get(node) || [])) { + if (adj === parent) continue; // skip parent node + if (group[adj] === undefined) dfs(adj, node, depth + 1, group); + group[node] = Math.min(group[node], group[adj]); // update group. + if (group[adj] >= depth + 1) critical.push([node, adj]); + } + }; + + dfs(0); + return critical; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::criticalConnectionsBrute1[] +function areAllNodesReachable(n, graph) { + const seen = Array(n).fill(false); + const queue = new Queue([0]); + + while (queue.size) { + const node = queue.dequeue(); + if (seen[node]) continue; + seen[node] = true; + + for (const adj of (graph.get(node) || [])) { + queue.enqueue(adj); + } + } + + return !seen.some((s) => !s); +} + +function criticalConnectionsBrute1(n, connections) { + const critical = []; + const graph = new Map(Array(n).fill(0).map((_, i) => [i, []])); + connections.forEach(([u, v]) => { + graph.get(u).push(v); + graph.get(v).push(u); + }); + + for (const [u, v] of connections) { + // remove edge + graph.set(u, (graph.get(u) || []).filter((e) => e !== v)); + graph.set(v, (graph.get(v) || []).filter((e) => e !== u)); + + if (!areAllNodesReachable(n, graph)) critical.push([u, v]); + + // add it back + graph.get(u).push(v); + graph.get(v).push(u); + } + + return critical; +} +// end::criticalConnectionsBrute1[] + +module.exports = { criticalConnections, criticalConnectionsBrute1 }; diff --git a/book/interview-questions/critical-connections-in-a-network.spec.js b/book/interview-questions/critical-connections-in-a-network.spec.js new file mode 100644 index 00000000..003374d7 --- /dev/null +++ b/book/interview-questions/critical-connections-in-a-network.spec.js @@ -0,0 +1,37 @@ +const { criticalConnections, criticalConnectionsBrute1 } = require('./critical-connections-in-a-network'); +// const { } = require('../../src/index'); + +[criticalConnections, criticalConnectionsBrute1].forEach((fn) => { + describe(`Graph: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = fn(0, []); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with critical path', () => { + const actual = fn(4, [[0, 1], [1, 2], [2, 0], [1, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + + it('should work without critical path', () => { + const actual = fn(4, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 2]]); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn(3, [[0, 1], [1, 2]]); + const expected = [[0, 1], [1, 2]]; + expect(actual).toEqual(expect.arrayContaining(expected)); + }); + + + it('should work with 2 SCC', () => { + const actual = fn(6, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 4], [4, 5], [5, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/network-delay-time.js b/book/interview-questions/network-delay-time.js new file mode 100644 index 00000000..99f8c108 --- /dev/null +++ b/book/interview-questions/network-delay-time.js @@ -0,0 +1,28 @@ +// https://leetcode.com/problems/network-delay-time/solution/ +function networkDelayTime(times: number[][], N: number, K: number): number { + const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []])); + times.forEach(([u, v, w]) => graph.get(u)?.push([v, w])); + + const queue = new Queue([[K, 0]]); + const seen = Array(N + 1).fill(Infinity); + + while (queue.size()) { + const [node, dist] = queue.dequeue(); + seen[node] = Math.min(seen[node], dist); + + for (const [adj, w] of graph.get(node) || []) { + if (seen[adj] > dist + w) queue.enqueue([adj, dist + w]); + } + } + + const max = Math.max(...seen.slice(1)); + return max === Infinity ? -1 : max; +}; + +/* +[[2,1,1],[2,3,1],[3,4,1]] +4 +2 + + +*/ diff --git a/book/interview-questions/network-delay-time.spec.js b/book/interview-questions/network-delay-time.spec.js new file mode 100644 index 00000000..c56ff203 --- /dev/null +++ b/book/interview-questions/network-delay-time.spec.js @@ -0,0 +1,5 @@ +describe('', () => { + it('', () => { + + }); +}); From f248e4276fa32cbf3b93140f77f0010c596a4d71 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 7 Sep 2020 20:41:50 +0000 Subject: [PATCH 135/200] :bookmark: chore(release): 1.18.0 # [1.18.0](https://github.com/amejiarosario/dsa.js/compare/1.17.0...1.18.0) (2020-09-07) ### Features * **book/graph:** add schedule exercise and solution ([6a83cf8](https://github.com/amejiarosario/dsa.js/commit/6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd0eb14..e48741f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.18.0](https://github.com/amejiarosario/dsa.js/compare/1.17.0...1.18.0) (2020-09-07) + + +### Features + +* **book/graph:** add schedule exercise and solution ([6a83cf8](https://github.com/amejiarosario/dsa.js/commit/6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3)) + # [1.17.0](https://github.com/amejiarosario/dsa.js/compare/1.16.0...1.17.0) (2020-09-04) diff --git a/package-lock.json b/package-lock.json index 7d5d9509..bf7a41de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.17.0", + "version": "1.18.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index feaa51db..5e130a84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.17.0", + "version": "1.18.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 3a2a24ffae2af5e5e348c237195f7a39717ae617 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 8 Sep 2020 11:49:22 -0400 Subject: [PATCH 136/200] feat(book/pq): add exercise with pq and dijkstra --- .../interview-questions/network-delay-time.js | 67 +++++++++++++------ .../network-delay-time.spec.js | 47 ++++++++++++- 2 files changed, 93 insertions(+), 21 deletions(-) diff --git a/book/interview-questions/network-delay-time.js b/book/interview-questions/network-delay-time.js index 99f8c108..97a00c32 100644 --- a/book/interview-questions/network-delay-time.js +++ b/book/interview-questions/network-delay-time.js @@ -1,28 +1,57 @@ -// https://leetcode.com/problems/network-delay-time/solution/ -function networkDelayTime(times: number[][], N: number, K: number): number { - const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []])); - times.forEach(([u, v, w]) => graph.get(u)?.push([v, w])); +const { PriorityQueue, Queue } = require('../../src/index'); - const queue = new Queue([[K, 0]]); - const seen = Array(N + 1).fill(Infinity); +// tag::description[] +function networkDelayTime(times, N, K) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []])); + times.forEach(([u, v, w]) => graph.get(u).push([v, w])); - while (queue.size()) { - const [node, dist] = queue.dequeue(); - seen[node] = Math.min(seen[node], dist); + const q = new PriorityQueue([[0, K]]); + const dist = new Map(); - for (const [adj, w] of graph.get(node) || []) { - if (seen[adj] > dist + w) queue.enqueue([adj, dist + w]); + while (q.size) { + const [d, n] = q.dequeue(); + + if (dist.has(n)) continue; + dist.set(n, d); + + for (const [adj, w] of graph.get(n)) { + if (!dist.has(adj)) q.enqueue([d + w, adj]); } } - const max = Math.max(...seen.slice(1)); - return max === Infinity ? -1 : max; -}; + return dist.size === N ? Math.max(...dist.values()) : -1; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::networkDelayTimeQueue[] +function networkDelayTimeQueue(times, N, K) { + const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []])); + times.forEach(([u, v, w]) => graph.get(u).push([v, w])); + + const q = new Queue([[0, K]]); + const dist = new Map(); -/* -[[2,1,1],[2,3,1],[3,4,1]] -4 -2 + while (q.size) { + const [d, n] = q.dequeue(); + + dist.set(n, dist.has(n) ? Math.min(dist.get(n), d) : d); + + for (const [adj, w] of graph.get(n)) { + if (!dist.has(adj) || dist.get(adj) > d + w) { + q.enqueue([d + w, adj]); + } + } + } + return dist.size === N ? Math.max(...dist.values()) : -1; +} +// end::networkDelayTimeQueue[] -*/ +module.exports = { networkDelayTime, networkDelayTimeQueue }; diff --git a/book/interview-questions/network-delay-time.spec.js b/book/interview-questions/network-delay-time.spec.js index c56ff203..24563b4e 100644 --- a/book/interview-questions/network-delay-time.spec.js +++ b/book/interview-questions/network-delay-time.spec.js @@ -1,5 +1,48 @@ -describe('', () => { - it('', () => { +const { networkDelayTime, networkDelayTimeQueue } = require('./network-delay-time'); +[networkDelayTime, networkDelayTimeQueue].forEach((fn) => { + describe(`Graph/PriorityQueue: ${fn.name}`, () => { + it('should work with simple case', () => { + const times = [[2, 1, 1], [2, 3, 1], [3, 4, 1]]; + const n = 4; + const k = 2; + expect(fn(times, n, k)).toEqual(2); + }); + + fit('should work with loops', () => { + const times = [[1, 2, 0], [1, 5, 10], [1, 4, 1], [2, 3, 100], [4, 5, 1], [5, 6, 1], [6, 7, 1], [7, 3, 1], [7, 5, 1]]; + const n = 7; + const k = 1; + expect(fn(times, n, k)).toEqual(5); + }); + + fit('should work with loops and dead starts', () => { + const times = [[1, 2, 0], [1, 5, 10], [1, 4, 1], [2, 3, 100], [4, 5, 1], [5, 6, 1], [6, 7, 1], [7, 3, 1], [7, 5, 1]]; + const n = 7; + const k = 3; + expect(fn(times, n, k)).toEqual(-1); + }); + + it('should work', () => { + const times = [[2, 1, 15], [2, 3, 85], [1, 3, 0], [1, 2, 91], [3, 2, 78], [3, 1, 36]]; + const n = 3; + const k = 2; + expect(fn(times, n, k)).toEqual(15); + }); + + it('should work with highly connected networks', () => { + const times = [[14, 1, 8], [11, 2, 25], [14, 15, 37], [3, 7, 70], [11, 7, 60], [13, 11, 87], [15, 10, 67], [13, 10, 58], [5, 4, 56], [9, 3, 26], [5, 11, 51], [11, 4, 92], [7, 6, 8], [7, 10, 95], [14, 9, 0], [4, 13, 1], [7, 9, 89], [3, 14, 24], [11, 15, 30], [13, 2, 91], [15, 8, 60], [1, 4, 96], [8, 2, 71], [6, 8, 38], [14, 13, 46], [2, 12, 48], [10, 11, 92], [8, 12, 28], [8, 7, 12], [9, 13, 82], [8, 6, 27], [3, 2, 65], [4, 10, 62], [11, 13, 55], [1, 2, 52], [8, 3, 98], [7, 12, 85], [6, 12, 97], [9, 4, 90], [2, 4, 23], [9, 11, 20], [1, 14, 61], [8, 9, 77], [6, 5, 80], [14, 11, 33], [9, 8, 54], [13, 1, 42], [13, 8, 13], [10, 14, 40], [9, 7, 18], [14, 3, 50], [14, 6, 83], [14, 8, 14], [2, 1, 86], [9, 5, 54], [11, 5, 29], [9, 12, 43], [9, 2, 74], [14, 4, 87], [12, 7, 98], [7, 14, 13], [4, 12, 33], [5, 2, 60], [15, 11, 33], [8, 4, 99], [9, 6, 98], [4, 6, 57], [6, 11, 5], [9, 15, 37], [1, 3, 30], [9, 10, 60], [13, 12, 73], [13, 14, 56], [1, 11, 13], [14, 2, 8], [4, 15, 60], [11, 3, 90], [2, 5, 86], [11, 1, 1], [13, 4, 2], [15, 7, 91], [15, 4, 51], [11, 6, 70], [2, 7, 51], [11, 9, 37], [4, 2, 92], [10, 4, 4], [7, 2, 30], [13, 9, 79], [8, 15, 41], [11, 8, 18], [15, 2, 4], [12, 14, 88], [12, 6, 9], [12, 9, 44], [1, 6, 87], [15, 14, 42], [4, 9, 41], [7, 15, 90], [4, 1, 84], [7, 11, 9], [3, 11, 75], [5, 9, 2], [2, 11, 96], [12, 5, 89], [6, 15, 25], [5, 13, 7], [15, 5, 32], [13, 5, 84], [7, 5, 9], [15, 3, 14], [12, 13, 4], [5, 3, 73], [6, 9, 85], [6, 10, 29], [1, 8, 24], [12, 3, 85], [4, 3, 60], [1, 13, 6], [1, 5, 58], [2, 3, 29], [14, 5, 67], [13, 15, 70], [5, 14, 94], [15, 1, 95], [3, 1, 17], [10, 2, 6], [11, 10, 44], [9, 14, 62], [4, 11, 32], [15, 13, 48], [2, 10, 77], [3, 13, 90], [5, 7, 68], [10, 6, 78], [3, 6, 95], [10, 12, 68], [13, 6, 73], [10, 1, 8], [10, 7, 18], [10, 5, 64], [5, 1, 55], [13, 7, 90], [1, 9, 67], [3, 12, 76], [14, 10, 22], [12, 8, 83], [4, 7, 76], [8, 13, 25], [5, 6, 57], [13, 3, 90], [6, 2, 96], [11, 14, 61], [12, 1, 94], [12, 15, 12], [4, 8, 88], [4, 14, 27], [7, 4, 25], [3, 9, 57], [2, 15, 90], [1, 12, 85], [12, 11, 44], [5, 10, 13], [5, 12, 96], [14, 7, 24], [14, 12, 98], [10, 9, 36], [15, 6, 17], [8, 10, 11], [2, 13, 5], [10, 3, 78], [6, 13, 11], [5, 15, 34], [12, 10, 12], [9, 1, 68], [10, 13, 1], [7, 13, 86], [1, 7, 62], [2, 14, 53], [8, 14, 75], [2, 6, 49], [10, 15, 83], [7, 8, 88], [6, 1, 87], [8, 1, 38], [8, 11, 73], [3, 15, 1], [3, 8, 93], [2, 8, 26], [4, 5, 26], [3, 4, 58], [7, 1, 55], [7, 3, 84], [5, 8, 97], [12, 4, 42], [6, 3, 71], [6, 7, 48], [15, 12, 3], [1, 15, 30], [10, 8, 11], [2, 9, 49], [6, 14, 95], [3, 10, 68], [6, 4, 14], [11, 12, 29], [1, 10, 93], [8, 5, 55], [12, 2, 86], [3, 5, 26], [15, 9, 12]]; + const n = 15; + const k = 11; + expect(fn(times, n, k)).toEqual(38); + }); + + it('should work with highly connected networks', () => { + const times = [[15, 8, 1], [7, 10, 41], [7, 9, 34], [9, 4, 31], [12, 13, 50], [14, 3, 52], [4, 11, 99], [4, 7, 86], [10, 13, 57], [9, 6, 10], [1, 7, 51], [7, 15, 38], [1, 9, 11], [12, 7, 94], [9, 13, 34], [11, 7, 79], [7, 6, 28], [5, 3, 34], [2, 6, 97], [14, 1, 97], [6, 10, 90], [12, 10, 37], [13, 3, 73], [11, 14, 7], [15, 1, 39], [6, 5, 90], [13, 6, 43], [6, 9, 32], [4, 6, 45], [11, 10, 2], [2, 13, 4], [14, 15, 29], [1, 14, 88], [14, 6, 19], [6, 2, 29], [3, 14, 72], [1, 15, 4], [11, 5, 2], [6, 7, 56], [8, 7, 88], [13, 14, 70], [14, 12, 58], [14, 2, 86], [11, 3, 57], [5, 2, 56], [3, 10, 26], [2, 11, 21], [14, 5, 54], [5, 12, 40], [14, 4, 81], [15, 2, 99], [5, 7, 57], [13, 12, 5], [4, 9, 60], [12, 15, 48], [6, 14, 1], [9, 7, 44], [13, 7, 69], [5, 13, 42], [4, 1, 7], [11, 9, 76], [8, 1, 76], [5, 14, 29], [2, 3, 69], [7, 3, 23], [12, 14, 28], [11, 4, 85], [10, 1, 10], [15, 12, 36], [1, 11, 69], [15, 10, 96], [11, 13, 69], [7, 12, 49], [1, 2, 95], [6, 4, 46], [8, 12, 94], [12, 4, 93], [13, 5, 31], [12, 2, 60], [6, 1, 87], [4, 14, 20], [5, 11, 89], [4, 15, 88], [4, 10, 21], [1, 6, 5], [10, 8, 26], [8, 2, 51], [3, 15, 23], [7, 2, 12], [11, 1, 47], [2, 1, 75], [3, 8, 63], [8, 10, 19], [6, 8, 18], [4, 2, 55], [14, 11, 80], [10, 3, 73], [3, 5, 22], [12, 3, 61], [1, 13, 33], [9, 3, 98], [9, 12, 69], [15, 9, 6], [7, 13, 76], [11, 12, 22], [11, 15, 51], [13, 15, 46], [5, 10, 58], [1, 10, 26], [13, 4, 85], [7, 14, 58], [5, 8, 46], [11, 6, 32], [10, 9, 41], [9, 14, 35], [14, 13, 60], [3, 9, 97], [2, 5, 39], [7, 11, 19], [1, 12, 27], [7, 5, 13], [8, 4, 34], [9, 15, 25], [5, 1, 93], [15, 13, 97], [14, 9, 35], [8, 6, 67], [9, 5, 39], [13, 11, 35], [7, 4, 21], [12, 9, 64], [14, 8, 8], [10, 12, 94], [8, 9, 76], [8, 5, 71], [2, 9, 64], [10, 14, 59], [1, 4, 74], [7, 1, 69], [15, 5, 55], [6, 15, 80], [13, 8, 84], [8, 13, 63], [8, 3, 91], [10, 4, 87], [1, 5, 39], [8, 11, 0], [1, 3, 79], [4, 5, 82], [4, 12, 87], [3, 11, 29], [7, 8, 92], [10, 7, 77], [6, 12, 42], [13, 2, 40], [9, 10, 13], [4, 13, 65], [2, 4, 34], [3, 13, 44], [2, 14, 69], [3, 4, 42], [5, 15, 98], [14, 7, 6], [15, 3, 94], [10, 2, 37], [15, 11, 7], [9, 2, 15], [13, 9, 66], [4, 8, 83], [8, 15, 23], [13, 1, 50], [6, 13, 57], [2, 10, 37], [10, 6, 38], [2, 7, 45], [9, 8, 8], [3, 12, 28], [3, 2, 83], [2, 12, 75], [1, 8, 91], [4, 3, 70], [12, 6, 48], [3, 1, 13], [5, 6, 42], [6, 11, 96], [3, 6, 22], [15, 6, 34], [11, 8, 43], [15, 7, 40], [9, 11, 57], [11, 2, 11], [2, 8, 22], [9, 1, 73], [2, 15, 40], [12, 11, 10], [15, 4, 78], [12, 8, 75], [10, 15, 37], [13, 10, 44], [8, 14, 33], [3, 7, 82], [5, 4, 46], [12, 5, 79], [15, 14, 43], [10, 5, 65], [5, 9, 34], [12, 1, 54], [6, 3, 16], [14, 10, 83], [10, 11, 67]]; + const n = 15; + const k = 8; + expect(fn(times, n, k)).toEqual(34); + }); }); }); + From 827177f6023f639db0c2cc267dceb0a27746038a Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 8 Sep 2020 11:52:26 -0400 Subject: [PATCH 137/200] feat(heap): add error handling for heaps BREAKING CHANGE: size is now an attribute rather than a method. Similar to the built-in Map.size and Set.size --- src/data-structures/heaps/heap.js | 20 ++++++----- src/data-structures/heaps/heap.spec.js | 34 ++++++++++++------- src/data-structures/heaps/median-heap.js | 12 +++---- src/data-structures/heaps/median-heap.spec.js | 4 +-- 4 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/data-structures/heaps/heap.js b/src/data-structures/heaps/heap.js index 459985dc..54863c39 100644 --- a/src/data-structures/heaps/heap.js +++ b/src/data-structures/heaps/heap.js @@ -8,7 +8,11 @@ class Heap { constructor(comparator = (a, b) => a - b) { this.array = []; - this.comparator = (i1, i2) => comparator(this.array[i1], this.array[i2]); + this.comparator = (i1, i2) => { + const value = comparator(this.array[i1], this.array[i2]); + if (Number.isNaN(value)) { throw new Error(`Comparator should evaluate to a number. Got ${value} when comparing ${this.array[i1]} with ${this.array[i2]}`); } + return value; + }; } /** @@ -34,8 +38,8 @@ class Heap { * @runtime O(log n) */ remove(index = 0) { - if (!this.size()) return null; - this.swap(index, this.size() - 1); // swap with last + if (!this.size) return null; + this.swap(index, this.size - 1); // swap with last const value = this.array.pop(); // remove element this.bubbleDown(index); return value; @@ -45,7 +49,7 @@ class Heap { * Returns the number of elements in this collection. * @runtime O(1) */ - size() { + get size() { return this.array.length; } @@ -54,7 +58,7 @@ class Heap { * @runtime O(log n) */ bubbleUp() { - let index = this.size() - 1; + let index = this.size - 1; const parent = (i) => Math.ceil(i / 2 - 1); while (parent(index) >= 0 && this.comparator(parent(index), index) > 0) { this.swap(parent(index), index); @@ -70,10 +74,10 @@ class Heap { let curr = index; const left = (i) => 2 * i + 1; const right = (i) => 2 * i + 2; - const getTopChild = (i) => (right(i) < this.size() + const getTopChild = (i) => (right(i) < this.size && this.comparator(left(i), right(i)) > 0 ? right(i) : left(i)); - while (left(curr) < this.size() && this.comparator(curr, getTopChild(curr)) > 0) { + while (left(curr) < this.size && this.comparator(curr, getTopChild(curr)) > 0) { const next = getTopChild(curr); this.swap(curr, next); curr = next; @@ -81,7 +85,7 @@ class Heap { } /** - * "Private": Swap elements on the heap + * Swap elements on the heap * @runtime O(1) * @param {number} i1 index 1 * @param {number} i2 index 2 diff --git a/src/data-structures/heaps/heap.spec.js b/src/data-structures/heaps/heap.spec.js index 855bc6cf..f1d6bb09 100644 --- a/src/data-structures/heaps/heap.spec.js +++ b/src/data-structures/heaps/heap.spec.js @@ -3,12 +3,16 @@ const PriorityQueue = require('./priority-queue'); const MaxHeap = require('./max-heap'); const MinHeap = require('./min-heap'); -[[Heap], [PriorityQueue], [MinHeap]].forEach(([DS, arg]) => { - describe('Min-Heap (Priority Queue)', () => { +[ + [Heap], + [PriorityQueue, [], (a, b) => a - b], + [MinHeap], +].forEach(([DS, ...arg]) => { + describe('Min-Heap and Priority Queue', () => { let heap; beforeEach(() => { - heap = new DS(arg); + heap = new DS(...arg); }); describe('#contructor', () => { @@ -21,7 +25,7 @@ const MinHeap = require('./min-heap'); it('should add an element', () => { expect(heap.add(1)).toBe(undefined); expect(heap.array).toEqual([1]); - expect(heap.size()).toBe(1); + expect(heap.size).toBe(1); }); it('should keep things in order', () => { @@ -31,7 +35,7 @@ const MinHeap = require('./min-heap'); expect(heap.array[0]).toEqual(2); heap.add(1); expect(heap.array[0]).toEqual(1); - expect(heap.size()).toEqual(3); + expect(heap.size).toEqual(3); }); }); @@ -40,7 +44,7 @@ const MinHeap = require('./min-heap'); heap.add(1); heap.add(0); expect(heap.remove()).toBe(0); - expect(heap.size()).toBe(1); + expect(heap.size).toBe(1); expect(heap.array).toEqual([1]); }); @@ -70,19 +74,23 @@ const MinHeap = require('./min-heap'); expect(heap.remove()).toEqual(1); expect(heap.remove()).toEqual(2); expect(heap.remove()).toEqual(3); - expect(heap.size()).toBe(0); + expect(heap.size).toBe(0); }); }); }); }); }); -[[Heap, (a, b) => b - a], [PriorityQueue, (a, b) => b - a], [MaxHeap]].forEach(([DS, arg]) => { +[ + [Heap, (a, b) => b - a], + [PriorityQueue, [], (a, b) => b - a], + [MaxHeap], +].forEach(([DS, ...arg]) => { describe('Max-Heap (Priority Queue)', () => { let heap; beforeEach(() => { - heap = new DS(arg); + heap = new DS(...arg); }); describe('#contructor', () => { @@ -95,7 +103,7 @@ const MinHeap = require('./min-heap'); it('should add an element', () => { expect(heap.add(1)).toBe(undefined); expect(heap.array).toEqual([1]); - expect(heap.size()).toBe(1); + expect(heap.size).toBe(1); }); it('should keep things in order', () => { @@ -105,7 +113,7 @@ const MinHeap = require('./min-heap'); expect(heap.array[0]).toEqual(2); heap.add(3); expect(heap.array[0]).toEqual(3); - expect(heap.size()).toEqual(3); + expect(heap.size).toEqual(3); }); }); @@ -114,7 +122,7 @@ const MinHeap = require('./min-heap'); heap.add(1); heap.add(0); expect(heap.remove()).toBe(1); - expect(heap.size()).toBe(1); + expect(heap.size).toBe(1); expect(heap.array).toEqual([0]); }); @@ -156,7 +164,7 @@ const MinHeap = require('./min-heap'); expect(heap.remove()).toEqual(2); expect(heap.remove()).toEqual(1); expect(heap.remove()).toEqual(0); - expect(heap.size()).toBe(0); + expect(heap.size).toBe(0); }); }); }); diff --git a/src/data-structures/heaps/median-heap.js b/src/data-structures/heaps/median-heap.js index 75c29b79..e8295963 100644 --- a/src/data-structures/heaps/median-heap.js +++ b/src/data-structures/heaps/median-heap.js @@ -30,9 +30,9 @@ class MedianHeap { } // rebalance if the sizes of the heaps differ by more than one element - if (Math.abs(this.min.size() - this.max.size()) > 1) { + if (Math.abs(this.min.size - this.max.size) > 1) { // extract the min/max from the heap with more elements and insert it into the other heap. - if (this.min.size() > this.max.size()) { + if (this.min.size > this.max.size) { this.max.add(this.min.remove()); } else { this.min.add(this.max.remove()); @@ -47,12 +47,12 @@ class MedianHeap { findMedian() { let median; - if (this.max.size() === this.min.size()) { + if (this.max.size === this.min.size) { // When both heaps contain the same number of elements, // the total number of elements is even. // The median is the mean of the two middle elements. median = (this.max.peek() + this.min.peek()) / 2; - } else if (this.max.size() > this.min.size()) { + } else if (this.max.size > this.min.size) { // when the max-heap contains one more element than the min-heap, // the median is in the top of the max-heap. median = this.max.peek(); @@ -67,8 +67,8 @@ class MedianHeap { /** * Return size of the heap. */ - size() { - return this.min.size() + this.max.size(); + get size() { + return this.min.size + this.max.size; } } diff --git a/src/data-structures/heaps/median-heap.spec.js b/src/data-structures/heaps/median-heap.spec.js index 283df75d..5f6de956 100644 --- a/src/data-structures/heaps/median-heap.spec.js +++ b/src/data-structures/heaps/median-heap.spec.js @@ -10,13 +10,13 @@ describe('Median Heap', () => { describe('#add', () => { it('should work', () => { expect(medianHeap.add(1)).toEqual(undefined); - expect(medianHeap.size()).toEqual(1); + expect(medianHeap.size).toEqual(1); }); it('should work', () => { expect(medianHeap.add(1)).toEqual(undefined); expect(medianHeap.add(1)).toEqual(undefined); - expect(medianHeap.size()).toEqual(2); + expect(medianHeap.size).toEqual(2); }); }); From edf8808970d57aaf397958d2cab1a6cc2e029d26 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 8 Sep 2020 11:53:11 -0400 Subject: [PATCH 138/200] feat(pq): improves docs and usability of priority queues --- src/data-structures/heaps/priority-queue.js | 25 ++++++- .../heaps/priority-queue.spec.js | 75 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/data-structures/heaps/priority-queue.spec.js diff --git a/src/data-structures/heaps/priority-queue.js b/src/data-structures/heaps/priority-queue.js index 622af6a9..b81772e8 100644 --- a/src/data-structures/heaps/priority-queue.js +++ b/src/data-structures/heaps/priority-queue.js @@ -1,5 +1,28 @@ const Heap = require('./heap'); -class PriorityQueue extends Heap { } +class PriorityQueue extends Heap { + constructor(iterable = [], comparator = (a, b) => a[0] - b[0]) { + super(comparator); + Array.from(iterable).forEach((el) => this.add(el)); + } + + /** + * Add data to the Queue with Priority + * @param {[number, any]|any} value - Pair with [priority, value] + * any object as value is also possible if a custom comparator is passed in. + * @returns {void} + */ + enqueue(value) { + super.add(value); + } + + /** + * Remove from the queue the element with the highest priority. + * @returns {[number, any]|any} + */ + dequeue() { + return super.remove(); + } +} module.exports = PriorityQueue; diff --git a/src/data-structures/heaps/priority-queue.spec.js b/src/data-structures/heaps/priority-queue.spec.js new file mode 100644 index 00000000..860480da --- /dev/null +++ b/src/data-structures/heaps/priority-queue.spec.js @@ -0,0 +1,75 @@ +const { PriorityQueue } = require('../..'); + +describe('Priorty Queue (as MinHeap default)', () => { + const num = 1; + const obj = { a: 1, b: 2 }; + let pq; + + describe('with default contructor', () => { + beforeEach(() => { + pq = new PriorityQueue(); + }); + + describe('.enqueue', () => { + it('should enqueue [priority, element]', () => { + pq.enqueue([Infinity, 2]); + pq.enqueue([0, 1]); + pq.enqueue([100, { a: 1, b: 2 }]); + expect(pq.size).toEqual(3); + expect(pq.peek()).toEqual([0, 1]); + }); + }); + + describe('.dequeue', () => { + it('should enqueue and dequeue elements on priority order', () => { + pq.enqueue([100, obj]); + pq.enqueue([Infinity, 2]); + pq.enqueue([0, num]); + + expect(pq.dequeue()).toEqual([0, num]); + expect(pq.size).toEqual(2); + expect(pq.dequeue()).toEqual([100, obj]); + expect(pq.dequeue()).toEqual([Infinity, 2]); + expect(pq.size).toEqual(0); + }); + + it('should handle case when priorty was forgotten', () => { + expect(() => pq.enqueue({ a: 100 })).not.toThrow(); + expect(() => pq.enqueue({ b: 200 })).toThrow(); + }); + }); + }); + + describe('with default values', () => { + it('should add values on creation', () => { + pq = new PriorityQueue([[100, obj], [Infinity, 2], [0, num]]); + expect(pq.size).toEqual(3); + expect(pq.peek()).toEqual([0, num]); + expect(pq.dequeue()).toEqual([0, num]); + expect(pq.size).toEqual(2); + }); + }); + + describe('with custom comparator', () => { + const alice = { name: 'Alice', grade: 80, assistance: 1 }; + const bob = { name: 'Bob', grade: 93, assistance: 0.7 }; + const ana = { name: 'Ana', grade: 98, assistance: 0.8 }; + + it('should become MaxPriortyQueue and compare objects', () => { + pq = new PriorityQueue([], (a, b) => b.grade * b.assistance - a.grade * a.assistance); + pq.enqueue(alice); + pq.enqueue(ana); + pq.enqueue(bob); + expect(pq.size).toEqual(3); + expect(pq.dequeue()).toEqual(alice); + expect(pq.dequeue()).toEqual(ana); + expect(pq.dequeue()).toEqual(bob); + }); + + it('should handle errors', () => { + pq = new PriorityQueue([], (a, b) => b.grade - a.grade); + expect(() => pq.enqueue(alice)).not.toThrow(); + expect(() => pq.enqueue({ name: 'Oops', error: 98 })).toThrow(); + }); + }); +}); From 65e302bd1c54f3b1f297fc24d9aabf9a5e942173 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 8 Sep 2020 16:04:22 +0000 Subject: [PATCH 139/200] :bookmark: chore(release): 2.0.0 # [2.0.0](https://github.com/amejiarosario/dsa.js/compare/1.18.0...2.0.0) (2020-09-08) ### Features * **book/pq:** add exercise with pq and dijkstra ([3a2a24f](https://github.com/amejiarosario/dsa.js/commit/3a2a24ffae2af5e5e348c237195f7a39717ae617)) * **heap:** add error handling for heaps ([827177f](https://github.com/amejiarosario/dsa.js/commit/827177f6023f639db0c2cc267dceb0a27746038a)) * **pq:** improves docs and usability of priority queues ([edf8808](https://github.com/amejiarosario/dsa.js/commit/edf8808970d57aaf397958d2cab1a6cc2e029d26)) ### BREAKING CHANGES * **heap:** size is now an attribute rather than a method. Similar to the built-in Map.size and Set.size --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e48741f9..36af93c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [2.0.0](https://github.com/amejiarosario/dsa.js/compare/1.18.0...2.0.0) (2020-09-08) + + +### Features + +* **book/pq:** add exercise with pq and dijkstra ([3a2a24f](https://github.com/amejiarosario/dsa.js/commit/3a2a24ffae2af5e5e348c237195f7a39717ae617)) +* **heap:** add error handling for heaps ([827177f](https://github.com/amejiarosario/dsa.js/commit/827177f6023f639db0c2cc267dceb0a27746038a)) +* **pq:** improves docs and usability of priority queues ([edf8808](https://github.com/amejiarosario/dsa.js/commit/edf8808970d57aaf397958d2cab1a6cc2e029d26)) + + +### BREAKING CHANGES + +* **heap:** size is now an attribute rather than a method. Similar to the built-in Map.size and Set.size + # [1.18.0](https://github.com/amejiarosario/dsa.js/compare/1.17.0...1.18.0) (2020-09-07) diff --git a/package-lock.json b/package-lock.json index bf7a41de..5b36d0f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.18.0", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5e130a84..bba73b72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.18.0", + "version": "2.0.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From fdb8bd8af644ddeaa07ce62773e9be96fd6b2404 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 11 Sep 2020 07:39:03 -0400 Subject: [PATCH 140/200] feat(book/sorting): add questions and solutions --- book/D-interview-questions-solutions.asc | 95 ++++++++++++++++++ book/content/part04/sorting-algorithms.asc | 75 ++++++++++++++ book/images/course-schedule-examples.png | Bin 22504 -> 26285 bytes .../critical-connections-sol-examples.png | Bin 35639 -> 37090 bytes book/images/critical-path-examples.png | Bin 40870 -> 42278 bytes book/images/intervals-overlap-cases-owned.png | Bin 0 -> 14624 bytes book/images/intervals-overlap-cases.jpg | Bin 0 -> 203740 bytes book/images/intervals-overlap-cases.svg | 1 + book/images/merge-intervals-cases.png | Bin 0 -> 28966 bytes book/interview-questions/merge-intervals.js | 32 ++++++ .../merge-intervals.spec.js | 30 ++++++ book/interview-questions/sort-colors.js | 49 +++++++++ book/interview-questions/sort-colors.spec.js | 55 ++++++++++ 13 files changed, 337 insertions(+) create mode 100644 book/images/intervals-overlap-cases-owned.png create mode 100644 book/images/intervals-overlap-cases.jpg create mode 100644 book/images/intervals-overlap-cases.svg create mode 100644 book/images/merge-intervals-cases.png create mode 100644 book/interview-questions/merge-intervals.js create mode 100644 book/interview-questions/merge-intervals.spec.js create mode 100644 book/interview-questions/sort-colors.js create mode 100644 book/interview-questions/sort-colors.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index d7228268..9e96a89f 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -843,6 +843,101 @@ This algorithm only works with DFS. // +:leveloffset: +1 + +=== Solutions for Sorting Questions +(((Interview Questions Solutions, sorting))) + +:leveloffset: -1 + + +[#sorting-q-merge-intervals] +include::content/part04/sorting-algorithms.asc[tag=sorting-q-merge-intervals] + +The first thing we need to understand is all the different possibilities for overlaps: + +// image::merge-intervals-cases.png[merge intervals cases] // blurry +// image::intervals-overlap-cases.jpg[merge intervals cases] // too big +// image::intervals-overlap-cases.svg[merge intervals cases] // errors +// my own image +image::intervals-overlap-cases-owned.png[merge intervals cases] +One way to solve this problem, is sorting by start time. That will eliminate half of the cases! +Since A will always start before B, only 3 cases apply: +- No overlap: `[[1, 3], [4, 6]]`. +- Overlap at the end: `[[1, 3], [2, 4]]`. +- Eclipse: `[[1, 9], [3, 7]]`. + +*Algorithm*: + +* Sort intervals by start time +* If the `curr`ent interval's start time is _equal_ or less than the `last` interval's end time, then we have an overlap. +** Overlaps has two cases: 1) `curr`'s end is larger 2) `last`'s end is larger. For both cases `Math.max` works. +* If there's no overlap, we add the interval to the solution. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/merge-intervals.js[tags=description;solution] +---- + +For the first interval, it will be added straight to the solution array. For all others, we will do the comparison. + +*Complexity Analysis*: + +- Time: `O(n log n)`. Standard libraries has a sorting time of `O(n log n)`, then we visit each interval in `O(n)`. +- Space: `O(n)`. In the worst-case is when there's no overlapping intervals. The size of the solution array would be `n`. + + + + + + + +// + +[#sorting-q-sort-colors] +include::content/part04/sorting-algorithms.asc[tag=sorting-q-sort-colors] + +We are asked to sort an array with 3 possible values. If we use the standard sorting method `Array.sort`, that will be `O(n log n)`. However, we are asked to solve in linear time and constant space complexity. + +The concept on quicksort can help here. We can choose 1 as a pivot and move everything less than 1 to the left and everything bigger than 1 to the right. + +*Algorithm*: + +* Initialize 3 pointers: `left = 0`, `right = len - 1` and `current = 0`. +* While the `current` pointer is less than `right` +** If `current` element is less than pivot 1, swap it to the left and increase the `left` and `current` pointer. +*** We can safely increase the current pointer +** If `current` element is bigger than pivot 1, swap it to the right and decrease `right` pointer. +*** Here, we don't increase the `current` pointer because the number that we swapped with could be another 2 and we might need to keep swapping while decreasing `right`. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/sort-colors.js[tags=description;solution] +---- + +We are using the destructive assigment to swap the elements. Here's another version a little bit more compact. + +[source, javascript] +---- +include::interview-questions/sort-colors.js[tags=compact] +---- + +*Complexity Analysis*: + +- Time: `O(n)`. We only visit each number once. +- Space: `O(1)`. Operations are in-place. Only O(1) space variables were used. + + + + + + + +// diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 67ea34a4..5a6054c7 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -139,3 +139,78 @@ We explored many algorithms some of them simple and other more performant. Also, // | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes |=== // end::table[] + + + + + + + + + +==== Practice Questions +(((Interview Questions, sorting))) + + + + + +// tag::sorting-q-merge-intervals[] +===== Merge Intervals + +*so-1*) _Given an array of intervals `[start, end]`, merge all overlapping intervals._ + +// end::sorting-q-merge-intervals[] + +// _Seen in interviews at: X._ + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/merge-intervals.js[tags=description;placeholder] +---- + +*Examples*: + +[source, javascript] +---- +merge([[0, 2], [2, 4]]); // [[0, 4]] (0-2 overlaps with 2-4) +merge([[2, 2], [3, 4]]); // [[2, 2], [3, 4]] (no overlap) +merge([[1, 10], [3, 4]]); // [[1, 10]] (1-10 covers the other) +---- + + +_Solution: <>_ + + + + + + +// tag::sorting-q-sort-colors[] +===== Sort Colors (The Dutch flag problem) + +*so-2*) _Given an array with 3 possible values (0, 1, 2), sort them in linear time and in-place. Hint: similar to quicksort, where the pivot is 1._ + +// end::sorting-q-sort-colors[] + +// _Seen in interviews at: Amazon, Microsoft, Facebook._ + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/sort-colors.js[tags=description;placeholder] +---- + +*Examples*: + +[source, javascript] +---- +sortColors([0, 2, 1]); // [0, 1, 2] +sortColors([2, 0, 2, 1, 0, 1, 0]); // [0, 0, 0, 1, 1, 2, 2] +sortColors([1, 1, 1]); // [1, 1, 1] +---- + +_Solution: <>_ diff --git a/book/images/course-schedule-examples.png b/book/images/course-schedule-examples.png index 348fe3de7a232c03bd2ebc49c263b43e2b5accfb..4dfa688ef35cdde42e0fa73c961fbf579c77166b 100644 GIT binary patch literal 26285 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 literal 22504 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 diff --git a/book/images/critical-connections-sol-examples.png b/book/images/critical-connections-sol-examples.png index eb3e568f4303b57b49aa362e4ce237f7d4c9066d..bbf2c22bdbde6c695962c625508d32420b701b7b 100644 GIT binary patch literal 37090 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 E0LA#_YybcN literal 35639 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%0A&dKTN8k>e~c%nTU zQb!tp(6DYDiEdncTSylZ@D;cJ`pp~Q6mMVOS1(^)QslJlUR+uH!KLiQwtF{8P-*E! zcXz4OHWp0{uI)ivS>*)>J$=Vu9cjm%`}b!?N3)8GB!q+%e13fcIty6-rNPGRkF4{p zH6H)I8z0}*-afauxIQ-=DkU;yk-J_x>cuKApXxu|D~)tbkdl$MRl<$wBbuUa z-dz0ir>DLBRzkvkWUl+lSHg^qSt)J_rZLv4p3l&_P-GO?_wl zOnm3~l$Ph9UTzmN6Vu64r+$8Uaoz9*C(Zb;?{CpC2r#t1em#M|17I#48)VmQ=F-v8 zk>0#@VV~_NmyLVTXmyPp|QB&VUCAeI9(r+qZhDk$|goN+2v$ZI}lU=zO5JnCLH#|kH|0-JVtBX^M zfbI45hm4bcJKNbYu(Do3Uyr8cCYvkpbF`jPsat^a3|;-01A;8gEP0@=)9i zZ9Vhy)vKQam6y?MAy8T7FSx|rzH>*`t~nCWU<>=Gc$ail(s@sH<$ide9)W+(VT6IY zK{wEG#kKpduXv6$N1;qsd(B*3nzK!vq;BSm)5ch#<3B5t?B(T!CnRchAB@s(J}Gep z7!e=FOA2lS?d|QnN||1_w6m!>Jbor#GFXJ)JLnn}sZ%F4@|yv`~KAg1o2 zIPU#8<0mYtfKF9+u}a+Af7amqd6AA%n}_A)UY*%GsMhFa*Iv=Lgx|cmHKv#GY{-jr zTyHmp&P6S4tgrh1nLgk(-5W;12wI~bIM3eRUd?~y+m9bdJ;X9|s;c^sG8!6&Q80+F z_#&~o(N-uZD9ESkdx-VU&Cj>KeOv9nTJH44f3g=TGnVrJ10CJm+^~A4{jy|~ZZq=! zsS=yu>(}2R(4%5B4y~-LU}PE^8gOekA&oJ`Z;R?|Z!hthvBYDes&PJMG`UQuk75*3 zUJq$$>165EU*9M;jbESxy?2ijRo&NjRr$)SjmZ*dxL?12UtHCszgSyaiv@;W`=<_t z3ipTJ-ij_m%4a9ezQ1?Q)fN5jRXtsPT~w~?EqzbV($aWRJUejg`0?j%gIB-3jsuv{ zqnxIo~vYvD-dNl|@3 zk<$Q~58)iEb51<_N?{bfh$SU?vckx~fF@#!TlMOlpV3%MH#!rJtyuqWEW{~@L>f_t?b}3=uN1h*iR{w|-$|`?1 zrFU&?to!QO5eQmZuYmpRkEbZ=8X6WC6mY5qs9bYEaCyDCvkw#|0+NP?rtreXP*(w3 z=hc-(XGcdtvmGP*_Us|)9}||8w8p%Gh}g#zjU<&__vz-d`jecM|2T?k>&_auBMX>~&xT zes~eMdHSl^+{$V2) z9rJCgarg>gtzB{O8Y~fPes`FwmU&W`&n7U*1JY`M9WPc8HEUmW;qw{d_%~xu?Q0=beg|^ z|BhD0B0=7Bs$2fk4e*XgY*q$B%lp4!;(Av0uWi~X`owH9qB_|g&**I^KS6Tn@ZpAm zftv4ixDoVWTb-te$hMjkW&&V+^E@$PGdI%q`pFkpnF)gWDcvhAD2ZTA2{COCii!-p zFKfS+c>nC#Gx6tUzIeRSAU{%kCG4=yFTm7b@ki7-8WJSQV#F6(>tMduhG2gWaN z17C%so04p->`1h+Q`sdkZxYFBqbm~3AexsuLy4hf(wo~&bHP1 z@KP#s(e3ER8p0IH7h|F9AS`{D9_}h27#SM}&uH`Tta)nTvXtSO1qCOqtv9n472KU; ze*L=C=$jlSUd(*R#6OC z^ZxPS_3PL7lsrM|G@|XUsHgz#^ZiZ2=g*(f;XMxt*(PX9AOxCLg8{NbB-l!^;Vrhb z7SVnC)>nQMqwQJ7l0>-xKacgm!^G4a$eQlx@Dv~WtS88rzwP3F$VNMM>?lxT-y&hO z3=J=!9R0&IS7&6{U?l<@tPyV*qOc%DL52O>I$CBl@@6Ys;H0N71;4|u731XW{9|(R zUo9v}J!nm(qzAyWH3{Ypn!<@^=M&Ja02Dw|NV#>Z9UbWgnY$AWcWlJWH}i&3x~cu$OWx}% zas*&QIxccYb`B0i{&UyK?qkkBW=y z+=sWh(Yo5d$4r)#%%MIL$wHFR2;5|si=GqJKyD(jK|s*c(~GfOpEy)<5dnzyP51W> zyMs6vasqNIJr}wB5q0%C|JAYCSpyH=ZJnP!VT`^T^4%t28WFIWC9z@O1V+Mlv7SGF z-tBAc{fR?TbjTpAtbbR3)-iIC&zC)W_Tt40unh)FdLPojTYSc4qM1b}Jd`?0$!EbG z4*h(0)Pt9;x5`uWre>3CX$g(C0iT(XQ7_OYG_z)ZvaqTuC2Q-i=o~;vFmhej?k#sk zlYFyxX7|dApdfVhRpM6VbX?l8y?uQK;1D56j?}h@2aYE~A&hEVcW>2cCP;zj16--9 ztn{oA4vYLfKW|%Vfd)ZPiO#qKH&|a^4?=bRlLnLN{QNu_4X2{}P!Opem73Qy8_-9I z?e>mf@*-3W3^|&~y0u@sI!X!J7JPzn+CqkDXP$lr%xCFZJPkD94&VeG3t<>EVL^;U zX?mBupHXqyqfkvv>3WFqjRSKcH33%-sV$3ZqSy-RC4nsQ z8EK}-v~PHa{wNS#A5Kg4$>~*Faoq+xBO^#f2XJm4Vw-!jsgZm6|m-o_VXJuVR4-Wt@ZU545Wg%+9UFq*|6B!tCJR*phUx`m|37}sA zTuhd6cmvf7xQ6JVc;DH{DGAjVf>mQL1{=4ffRAx|*6}z)Ofem8%Pn3JYg|zoKFuabacR^vGqPHxR1m)@XDLnhEu1 zWWd4QhuCuRBzRPVrE9|C;JL0$_ad)YplVHj-jAL)lb=Bdn1hCzS`~c}hz2C${(>y+ z0(4~3$?t&G(*ffV(5~et_X|k*O(Exi>aa zkui__8PXz24jCKIBN8Bcq9#!7v`1Uh>~^sE`=zGF#w5Klloqeq0q_ygAI84jel<9# zDk}Q+-MbrVN&y>d2TJEb^4;Kx0_$#O)>Gs2JMt#kS?DxJ_4NmlRDf4-3Us(&frIBk z&f#z0zV#Garza%HIlf~$E87x*4KJG-z`_8d!+p`Sf5?08_@E%G%^ z2tJI?>n7$Gr1(8~SN3GRhh3Aae}94zPAw62O$0+V#URZCJ})v75*lxuHogaK79G&p zr=Qu(8mv1YTD7f-(xRV5u5oGh z$i>6M{ z!=$i?2rSV`_#}?3oDd+~)cpPXcYno2d&~^Zh>%5Fo>Nc&@_g$!fBwxGnQGtNxghzK zm7&4&V-WZ383wZg76M)y3`(+`^WCH(YTlfvif~M5?ABq3)$Zr#cjQPTcmiKASrUn& zAfnH_zJ=DlYtrM?sX=t|MtR3DAtDKHhTUQ0SY8cIymJSH6%#9Ko$ue6x`sj|jAzdl z?}|s1yZ#<1*VlAmC1JHcCgO>j158j@Tx@7y0P4mVmpXIi8`8eEKqth-mA^lW^Yf49 zb^%@;KXy!8;5PUN0vsB@ylarGJ3Bi;NQH!iK;A&x&K>&+Qx93f_v+P`FE;=>+3AC8 z&8m^n&{E?VYk!~)aRHSWz6qsE-^c?O-R0z-p&w|UT!0R;IMZ(qkIj(>!XhFj!c6k1 zgWcWDj!z*MVQe7?A;h;-V(@dKqRKA4Qp(EJ0M-3{ebMim-h{;cAr6FSX3f8PO)#?F zTBZrmXnX;<7j}dn(AS@aT!E;?1OV{-(@Y@>(3uPj4(_Jf8Q<#inO%Hj$|k8>>uNlloFr)q&q{%)$GJSK6y$)*hxM0Czy<;KG)Fwm%teP9uvyFBNDCe zS+c9Q)nBL!zRR+-YR^R%5>Cq#bR;-ny~=;6KDfm1fXi2!RLL)JX6&m4{!ET>LMA&8%dw%N9Kz*fKEjgOg6miSAuGEeT0`ci7=`+O&&j zW-Xls7%-&I-5R=bEyBXJ_u|SOO_k2BORG)eAJ9g~=j>4p{uo6=&`aKyrG;zb1rzeU zBL)lZvz8p&$wI1?*XGICnHXvF8MzM13Ts})Xd5i};Z3XZL#Mf`O!R8F-{XFMosm+A zP}`_4I7ED$K^%y}a2QWc4m|5w3LUwx+_6BxXDf51@a9ba9wl}Y(^4_UI0nq{wthy7 z+P2g^LS!4uWTSR*MNPP8j(EX_N5&;rB=0)#nQUE-oF8zNTtWgbU2Tt%vS`Egns!!r zQ9pSiCBYKsjT7-HbF31n2mt|eD{=#sq5iGf<~DM;-ifF1w9#-kS6C27Fii9=7-L5l zs+gF$@$}xr8y?}eYONj4*vwceUZJrV?0>r>&I@NF?Z*(g43N`uAJUCBqSR8lHY_kA z&muUSe(yM!3t}MFGuzwq)%=gPa)tFS>)Az)oezak-t5Jj}P6ZbvvY856rpoOqD;rYV zq_<;!{WnbdN}-&C1N2M#R~eNjERORs?8G(6mFeHU33;w?Pm$!=vm*sN&Z%o({$y$O zg8iU>NdNP2iyeGAh?&Sa#EeBb)zlO(-;s)EyoD6!5DKAWp;`Q#sv^xIbUGmn^R)Bh zMHHSGw3L*gk!@Nrwngy+p$#u3b+*r{wLH_M;6V;uByFXIA zkRT2`Ag-x5rs3g7THL==9y1#;PQ1hT2Palh8R}Q4xXK(`MOS(aH%8(6hUk2Gd|MQ0 zT%6)@p|&tp40Nr(?XNTB)Gb*O#Dc9ec?;S(I3yk9dVjAWPwCvXrmgd+4sZCse%q9% zMAX~*$kIUPx#39)9i6#9;sJ8HxzjEWuykCfj$wh6NZos^-pr)iJkxX*V-pk8UZ-|X z^}6-VPKpnVT!dQ*;no4cUAY~7UD{ekd~Q5$80OcngQ}J9DMyqWF-Y7q^dQu~-F4{_ z?;es*y7coQ3>R13Q>%MYs+E~o8nd)2%tT!0lJW02dNz)xoTC+H(UGi3%zuZs2jEm} zY(Wq9oU9CS&N12Xq0+gqvf|J&CZ$h@1F-h~4F6`D{(JBK@Ehi`^NA&Nmom2#ii(U( zLb%h2|9ao=Xm0q^{Y&AT)_@f7M2ncSjc zig@UofkmNX2D~#zqAIu=`}dcLI<|!bZX8xM6OL5sAR(MRD=Zw8YZ#TsMSoG4{&}d{ zm79;am7Q6>jW_)sZ|;`(y!ELddVZUsLuIq1od@wChr7kO4w{;_cZO77iOM_mWLOQ8 z)EaO6ly62I7YTcJ%K0!~LvN}3=0WLaN2M|m4{QoFr)$GHO&YfyBC_BvdC$*UUcWdx zG;d!PBmOc{6_+Tr57xUzMoYenK!0NEM(VAU{M0t778h?NX`i9G9r38rS^Uv4sr~BX zO4`bp7qZ~z9!nk`SmcWqH|Q0w6ozN<4^*n3Aw)Xe-m64tgeL=?9*#F}bR`nsIzCNJ zNnv7U{{DSmON-ZwtNwY9CLo?^9`lZgasSCZ{aO9kx?KUFC8{^*-=drz!`K+!)>2qWK!Rg#va`cr zg0Uz7;C|urdkl&{8g3>^2VioLpOA^=6%<%cf4!R+(UG-h9|emzg9&x!(Sp^i5*Oc!~Mei669kvQ!d zNoy(L$6Xt}7pr%rhAqA-V&pZ{)#h`2`WZYMI!jCzgdNOEOYUi!h%NpJHY0{8fMgHY z2Ecn2P|{Ki@7p)e&LJ(V>&G|`F$`+U4gx4&Dhi6c!orr^FOYeCe0{+>=jG>viF)zm z2}AyEQ4wz$nHmlSDPi3+jHSdsuZrSd65oBl1Ud_jrPYPW(Vsu9PoFl>W`lnUjkN&7 zIRpc|WG&h67Cg8KlH$~%na$Gl*q(p}AN?i#G&SDyA-C9cj~-oLTZ5bL+O?N(ae-VA zY@y+K-(N-%dWk4Sf7Cs2T8ZRWw)Y2qa1@o{;Vl>H*5OitKbnz_?oc-=D^@CoEH@`- zpNNR1g@u@PZ4DAfgo6xQ#$%D2`BDFW{2vEc@}*Cl&~bdK>lMf(a#6oog&RZQ4-*E= zZdd0=G;C}#gx^WaN=rvwzpji<7yln)J-@AKB2qwg z-PpTXl74)AyuY^>_T9aLf<@MKr)6_5qe~h9>4S|R3%`F`mD*{L8OC_HykmRa79O(A zC5utx|IC{~-Y2DgE$HFHFuxYvLM*TipG@FsvaFL!i*o&?r3dR8v;@@~+F5e`jY4aL1l?a9D(8iA0w- zuD;WRA?0}AO4eMYDW8OhNQ#tgNO}1mu)Js?BWZGvf|i_zY5Qe!v)HMsV?n#F>+0H^ z5ui{lM-IFIavnp3jync{1dD_Y5)$YpC)qxj6ktar6>jKc;8uI7B5_j37LQS?(+p(+ zJ2}9CpzAZE&tGJ9adClNH62ed(_5+@)U#%bx;f{m6%IPNz;EK zinXm9Yd7=KE6BkG89Fl%9A@KcQS0N)KdumajT2Tpb*Zz*0#2po?yE^du4d&E+gl_%lP*jWfuImv9I>a%g-*v zA94K*((2pz_?5pLEpI40yB<8I{OumLYf;OVZjlJK#1BN+_qU0Ee|(~im?{S)=-_}7 zqM2h7ZoGlv0weE>0e9nSF>G#YYmAJP!gV`(dQLw%LvipU#WRPkp}lb7XDAu1{FU6e zg2Ldp;kky=v|5oym;__P=D)LpZ{NOcDy&XZ@;u-5P(LZ1^ci-${QdO{CF@7exq<{{ zzjex=UnuqoZ^O>0G_}A0xV+(eUg{Q}z6%=8=O3zaqkS?XSIBW(>5&>`)FYu0=$NQf zu;??TPr>4~cUt7%Tm~7+sgGmXfHoLBlegSA&>>ObDn8<5TuL5~u;B%QQkCbO-cue& zFwR6(dLaP;SP;15GeIZw@$tQk{+EkrgO-z}$H|31@)pj)tUM@dmpU}U4^`@}?Vq2msMsHnCMNr&&y zp9rbxSU)fUo#KoSPp%Fa9NHRc}y&*q}Q_c$-_M5$d1{HeQk?Lu)sW^61C>(SDZH&y-w{JtL% zewdBw%jCz*)g2$sg)}mhuhSF$E8jtJnqD@25MiDEGT;43AO;_mwBTS8vmJf?{j1B% zFuj65-ZBriwP9}uw!E?D|EhL+eQOVL{cO*kyLaa{RQ=XP?ghF3UH*NRDwUZ48OiJC z7gZ!Dh~}xu$@j4V007|m*8n`f0rhT~Ffd!+zk9CJsjE*6a+sKeu`=D2`WXv<19lAn zq(WuPG0BrfNnN(0gxEz+n6nPctEo8|w7%YaQ-d7zHJ~(mfvrkxccX!uZU3~n#4iuso%iG>wi=#((HCZaX z+>ENKCXcB+AgiEmnc{BO$aHNz?!y0UC9pfLVNQ+>JbOE%yyu1*faWAidQGnB3Bt&X z9)N7;&bx@;j~`X>E;M;n$rA*$A;`qjv&Nu~&h7JC5x5aK_tHj6>Rb;Cidfyo$`7D% zC^uW2J$P^gKG}{PwiX(>OR0TuNtak@O-_Zx#CZF)*!A)(<5O9=xzCZTp|8oOo-#5j zv1^G&P~2lIwOOaP!V-XYC@PA=%xVL!C6v`Wn`a8s(oS1gz`xBwKo0o=IcYN)O4ht2 z4@lWdl_xjqz|BYL5d2iQ4NF?B9zNt165>`ZH(jGpSFICnwq6*AFbIbWbOQhni2vAK zi7AJM1>>4{dh-JZY=y(NNns}4E3}-dmMU9eK~C^cQk9eQgmwzQkBPZCR{8=|6GjFG z5ak~>gM|NT-I%Xxf)S&oCC4ga;Z|K;T~U#nsVQSx0wwe2zTSle50V%;x$lK1__cHX zKl|(2)dA^u2En1FBFg+28$4ZIXI%TsDcq;iR8?GE4~xu{sd){|ZacJIDoXk~o==r; zCjow65Zj>K8Q?;|ej2&+-NJ(L`|3;WJR)A$!^i`@5V{_;@ORBGUt$xPxJAjKAp5qq z;FgfaBkw{Rxu;@}@J&TQCH&gcb64%f;cbX{qNXNg4NX<$0qlDv78{1#ghZi5B$il+ zWo~bHiT)JrNB`iiW-U-ze` zRE6H18aMt6L%}XD#RN)_q`$|LUJA&f%!IND*jZWi!_EWaszH!Ay9T1_4Nwz8WN-aC zXYFv)VPj*Lt1ho_w~!XMOwqY^(oAcm|8Gmdu9J~@dA+itQ?ZS_JE4Tfa4EmEE0uTY zJ>;9!(0|V2;!wrs40V?{(bOvS_in;rxH;xI&r^4-OxAuv@ zr5R5j13?O|WRmSW7qU4`O@;T7T&%Q-S>YdR=BM9Y{~vOGEb{3`8)cx>QNh>b?3Cjewp*h*xcm3X`um7OjEVEqy$@Ay16427npm*e_ z{p+blx>Yi;BN|Ts>Hg=%<2n08Lu+e$PYP}gg8ImvNQX0LuoU(?yt$(jFL&N|K7T$SE4u&<2*4ohCwC9?@bECy@Qar&DS1vY znT?k}d}!yj$g`+L6=jO>#?DY|KQB^L(x8>;xtr$MnB=d$dM>Kbi z8Ikc{@n}>iIcIEbU1$G_MqRxL3hh?weD$i`=^cUVk{3VM6;Yp? zjZLEa1cvuNlhMNr1ck-L2g}YehBjju1gU zczMZ(HuTo`Tz)Rk)5w|lmU`DNdzoaoXkgSNZmA7S`p3&|e+yDj! zZcy?dM}pUw|MkmGiVf9yNo_7ZJ-rT|3~*N16g~ar#VXJ*h?~azn7V^e*)-A1*cXVM zm&|l@?o-|SR8>{g)aqbRyJruVgtGt20yZMCh+Cda zsoAObzO5b>#6H@tE>rB>*4KB%W=v>}jYXvZIsj%EVE*`4xb)!lMR(2UmE*_GUXzjG z=EqHRf#8mmKtV-?ot|f8KDV|`qNRd@-dH57s_Kt3AsEmsL6k*X331);?cI47m#TT6 zwZw*LrM#(FSM4F0q*Dq`?HPDDzqKSar}h`3=4n#N?`)f{VJoECmKbh|eBeL&k{Wgl zrTeqsg{-W6(Go&A<>BFhOO8r(DyV|?ewBfa4jL<1vOf)~F8)3{hHdQ=9#y%yYas(Co<9^B2(Bm4-blonHfqT4j9xNWRhV49Ta)`-)q%owCS$Q zRPhvrUQY3T^Yg#P-zQIhy?_`U`G-+^1fSQN*RPXOQu=y(QK|PQzk_At?HjM3KPyX0 zq@ce8dvYv_mSq!8tj90L}f$75nx0709yRrJHORGuDE&Z=!JC%0{v$fFMIne z4gEH&1CPt5&jo3uL~Jqey71t1E!E{QLaKN+LHcF-p~czz zVM2D?v@GHwnS9#%;WQF|v3U}EO>mTL%14ooe`uQie1ww0N`A!8HR<0NSYmz+sPVp4T)sI zLk0}LdS2eV6-Q!hoKc|XA*|T>DRGW??-s%8d1HED$ixSdmiGGKx#8^{hj}X)SC2A6 zc^z(|W2bDoM$biAyOa9%H|#Z|tXtd0DAd^Zj2ID89K3yxBrQApq0?y-Ms%D}e0EK$#TMVRnic6+SB_j&I$1l=vF<@3@6OxZ ztv%GK7R%l6v#x1l-R7K*hcMB|n8edFYCT#bfOwK|zR=438+llm_F&F13ofcX(4LpM zZD63jmBOr$Pl;(ndrm_LXO^K)yxVwtZ;1^_OC29~960d0ZLboIUZDjEVeao& zlPl*c(+pPH7GiTdQ0X%bxfShQjhMhd$ z#u9x`afE(q{ri{+BVthVLhqR4+^=n?PW55~kr9zlcfv;{bM%nAfC2x=L%}2k+G|w7 zGyPFC8nRC3bY7pj|H60Af!%2;B=le2?o_k1tRFt)u=mkp1}@4F){E@)o6ABq0o3Ck zvLa$Oj>>2@@7`TvPc}V3@$w}xf{(qdjBtp-l4Vi}Ox@3~P4DlQ*heh9H(yO76~OFS zR55AZxK*W3ra4^13tJ~bE+08hwwpo9Z z18NeR^-gB)06vyi+*W2gfAloGNw9I%_Ymfb(q;bi)0`;9=YKAbc!5^pm*tp9-MsGpni_Oihtyp^IEC|skXu0sc;G9aE8({`VJx|E19t|9piQ;%8mz-@+VF>o##`El*rEy zMd)-fYQ|#JI|PM<4BDa>?g^hx8MV#3V*5&=L zBaJx9FRXe^eB~J!jEYhBlU2y_>FLx6(`*i0-{I-$q&R?9w!K=RUr0eLym;SK{g zO+rG+dFGCbk<1dT=bbgGUfsQm--4iH3iCQLl{R&LqAOy87dh@tz!g$e1STF5{VHCq}QO)wDF< z$fY2sprGdS3j*92cmnJp;iS>RHU^xCoxQ4}!s(x%cIa}#_S3C)L?i*fXaRK?sw+&| zAgwLL%)kr=1Z-^mG7=yvRDo;Pb^@AW!vz@`8Gc)BV|~-w_bhvR^Ww94#z>uB2V*{R z7V$`i`ijy!`q9UY-M5#yMIJAx=8fi+h&(E4nIpn%PHYb`%ZauyX4)3XTS3UI2$~kY zPFGH_{X#qW<7*YKj-w1?($`%1WZ&6Ph4I#J?_Z2h**)5DM)(u3wJj^`104_TF%d;Y zoBp?uIg3wL-cCx|B1QA_Cp}ish~f8Juv-z57b$=K!-wGh(4Syu5oAHg-q=VA+W-hq zcr5WtE7&}grs9L&-7>YZf|C^NkuyjIaD9%B*DkoRG6hAD#jM+Fe0Z-V-S8^X$_geV za*76#0CYMCIRJZ{3!a&vPr{Rz7F|3_n4LZPE!VCGc5xRoh#6te%6l(54K8{6N`L1Bt)U6xjs1qTG! zylZatE2GRE?F9{MtnO0N)3^zRx%$iIza_=RUBK2LC__#UFc;JSn+ifNqQC`-upD|9 z==KlRe}y6-?Zfwe6=MUs4-+xeO4B#&^K(Xpcd0QP1{$6`dK@4g=5%wdS_M=dI_sP) zERd-f$dsp`m%K$=dzb7vs3X8jFwebb5ScRA&=6GRmeBul&01CCW#!*#SFVr)7btAe zs;DBN;G4_8R{)TLkMG|@7*GgP{<|&`IVbrl>tXNp@}jX2PDKn*`g@+zuU{W^ z$s!@1K}LpetPwT?T%lXA^zGdF;K`FFINqovNgJxX4wea|-@y9#qf!O$S#-1s$}U%R z$w8)dE}zJEG(O&Fm4t+L=!w77dFLrqO429 zi{QQ$5*DtiYd_{4v$uk!R%)&!Wl5Htrr}BqKgU;ji(l8!!Xg&jL3E>z9h-tyKlXMu zBrk6toR>$lp(H0~7-FE`4SqyM5uLC+qu86;+3j>14hzxl!Q@bQJm~1?plG2P9`S7b zHPsVtmCzPiHUs<4i_>q^4IBYwBGu!D-pLVV`IqHDsAw=Vf zie=E6d**-o^ot(FtDm@kz{b4g|6wPe41et54v6C}$c%lLj}U`JtqG+OtQXlu@46K5 z*_<&TRBUl+i$YhdrtR>Nb}Ff7e29B!x|aib_i56}G$U zZ{E5^W0jz81FgsoR=b__-b0|16%&nO&hbr7^Z7;uz!!px|MO!-b5r_XZ0snD!E^=6 z1^TJW#r4r$+@F5lWbX<#USqKiIv?jl>n+>SGhe-C4LbdoGpl19-(smon+aPu)FM<- zMeTL6e9G#p^>~gI7KP`DFMO2oZ$}~b6Y7IlDB*o;(O+{5PXCQ$@(NluWHNco?Ct#M z+`;QAuBxKFCi$js2G}YNgjZGdtinFU!_SYtYn4GHlS{4@4|+xZV01v$vF7*DppzPt zA9+7M>S@&3A)9`9dnRgnwnP7G(Zz7YEN*@7t(5}V;$Rb=+Db7 zOrZ+jgB=p<>Osk=P&jcwqWKFh2Hdp3Vxdn6VL#3aO)n%jhn*UV4PahdQ6-D#jiIQ; zdV0=Io$nd0fHe+4nt}QgC7NmpIQJ|OnIWE8OdqjI2A#q~sW~i5NV&X9TDs>Nmt35( zvFj38CqH(V?Adl%>npS;2zsC|gcoiUkUJ%(rUXmcfeKd+8T}G>sFh%1YEvJbU&6r* z4Gl@08aM;4!gbqYXnp+z+woAe6q z+ult`5V{J?+HT_80w4p{6z}cf@2EM#26M_coM?IyrtHALz%jmp#Tjk44?9P*%$xe6 zq~_8uzilyoaCJ7$(zz&=A)au>mlPqX%1k*${h=$5DTCm${6j= z*hATb2h8B;G241zQqakO#!ljQ!Zr&!ta-YEtG7(1w}pXLD}@u6MViIHBVL!UC*JPpjuN$sIMqKqdC~Yf4EKR#(qguR$ZY z@ak0nEK%O2Qdw+?ECQP-JrEXLN=uX2=clrndeFcqQnprekVuAUth+pYOG6d<3>dP8Em1yy+a6!@ZbPgqIc&w zVo-cO9#oWi!GDCRw3sCzxu|Fy4~z+=zn>*pgf!!3K}yin)fFC$q+-v+&N>6NA)>|X z?EMZ7?%v)x=guwk9?DEA1$z~hP#i3a=dN8Q!(vJ*J&(<3WHll1r_i=Ue+7Xv2y?U$ zR!4{Yv%eY&4t#a2+b8|}jI6>4sq-Wg7S9gU=}o!aWCMdfe?myNybR$e!Z}c6)Zv8% zDh4gxWF?3XM&@XiL;MLFzpN~aA{{+Qsfc2YDFNS={QbFmsnLRa2*}3_eeLLSo0>wf zNDrU+emOsX48C?qkztwYE482hbNEn}M2Mkb-KJs8ZEhv`rZR+WYH9NQ`@ME{0z5o0 z;PN3M+_vp8JlU~1@lJG3xi5YO89y=OOU(v)+UIuLpcW!DhA=HlW;g4L zs^bM0#Sn3#$pekh_KirgaLA#{b1}GcG87#E+Kr84qJsx8e{geAVM~g*eoX=CvJUEGw}^(#xBfEGobup2c!C?p;(M z$HF0`W3?WyTs=HMlaT9Y6tgoOfJ)0m9{MjrUEo(aIYA;$D4vwqo|G`&4g#K@H2WuMLU@)3pIHO2?-Y9KzL7WsJX>k3w)A^a#-p#<8nwdlr zdcTkyrL@dw475l0PDYQI^*~e8`8lim{k5xCRWClmjtl|YcAxJHz3uj*qB#f!&pcNq zlSK$UWjARAH&V#(p(92I3#jYUl}+r|lB-%Pa`W=SA5=D7tE!r7e_VmqCxk~3c>~5w zut+Q&*~pW}Vr|JrYIf3N>dcVGh$VeI&XUQLz ztj7+$+cxT<9iDC=G2o+~Yk+9wW_5K5j+~Pdk(d|Y|gBULn{Nv{$ia75IaXKNPu&|iDvKv^> zm?_vPORcQP8uaGi)o@yV$0CiT5e;1^AQ8yL#>S%k7x7R^4GP~O1TQs}-@RB_aTiZa zP_DOd`_GdInOhOWPM}YRHL0k)oQzltn>3=$k`i_T2u1oO1xnmoM0;O`e-N4Cs;V_x zX*jj~5u#FBd{a|F5gU2bS&6^?YEwVGyr@F( z(G*J6UN4BH8z2~bOVX{pc=oYLS=Vc673u~P2TzFwmc@!2jV$?%W&xvzuMR<=a{&vp zHPREfcU@|Ed^C}P4TmPD%2q9Yb0{uh$lK$IM6LSOG`jt+(w0xruLDI>0fLy~J;7ut zY5Kn$UQ|XuGD}D)Can`R3~BP&#>6G!aqys|-B1q$TIP3rMk83}(^y%RJp^*=*9)i< zqqDD&SC_v4`wKNPh@7fYq)r1c;q2{w^5R;je`^6YP7{4kYCP|=Oedu;QAs@NV=nEv zH+Z5Pe*yJ-vh{viKQ&Dj#UIdx`SSX=8PfYc+wHLK-1+F0I7b8yPzXaD8kZ;=%Y)|& zEIH5D8ZPUkr3mR87&}Mwq8^zkq|`t?QhlWD<_+*5k01Z??VD+dtM~!%MRE|PB3y4H zcV90*doMZGy@QWUK!D|p*&}CVTsmK9_7V~}Jp3)Fu&m(i0q5Pv+FYY7P8YHmPUUiL z2&27yG3nz}L}O!5tu?_1ksP*daPgeQEDa$WRYD96gc_7Te78Ie>ES#NjD9vdI{PlR zrwrv0Z7@S|&j#Utwe%giLf~n#Yq)Wuoheg7qPV=(Y$)huTK?{M!;Nalx{WCx$n8+4or4ab}4PW}DNL{^(xU;R?w7^Cd9pv}NZ(}oE z*{QoT!Vh{f>`VZbEnM<$BHi-b$y0Nav_R+aa^XvG2Ysxd3c=2vE=JO_9dUMref8bJ z!Cz?hQ{vmQAvHOGTuoZq6hwuniOt>-kqlG$Jsl6&h8n{o==0WL#haX*YzDBcKx^a9 zRwP{5&++2-Q&Vz=^HD@))d)HUo0scZ1O4!=3KRPWehly1B~j@;Oa|B!U*YWm>*k+g zEC7nqRKw74+sE5hzQ4~ayFvU1SAVJ`bWI%+qH%It4qac<~hvOstwi6M*<|Kpb?*BYlk@f78Ye;od9JC z30Lr#^BHdkuKw{gvg%;(`Ln9Fa+w!nDUi>gR0gdL_OFJ9hPNSscBiOuaalU2u^`Sv zD`foB)4`7A^l9bOs#8y;%s$f|lNwUV_3*sB$+fRhNW#42~+fyPI3{-&w-iSq`xW%p#~6l8%*FB_K+`Z3U7?C?a+w zP!ggc*mY&)d8?w*Z5G;sJ6J5%;nF$8d;JmaRKp@c(++?%a`!INS2nR?pV2l($Oqy4 z&d8V$ySwb=C|p=%aqmp}O?AH21{SfCq>#nY7?iNFacW%p1(HIZ%qn%r=3P8Jg#`t{ zwY!h%h3}R5j?UI7R{es!VouS(-DFp0PE(H~%-=t=J4#PTLV*Gn+^eTg5hw@&hV*vM zW~Yo2(j@HE*kRMGP!gx8A?jbEBvPwu6@<^V2k#|4dbD+pE4}$N@4&!_-;rty zl{@01D#VX}8Rm38<*~0ZM^z2w&@ljnigwb7rC3O?f;=}om5iDviuc%90pG_S`3nWx z;;2uP`p;ja-U-^l!f3b0DX2S~ff~ma@zg09AR&BU1^ywT*L9n{6gF%yknyTL>g7fD z9g9LzcHZ*q>?~Ga6ZtP`>!}ylviV9mohj2^cpf}WmROV`n>PB%w7E%KzKr6kD0Hb# zbw1*Ww8s}*6{y9OvU>G^JbsNQ8~HM-g%`I@&=k;FSvCpXqhf@vXV+w-(h^9`!LbA} z3k%wtU>8NP2zd^0B(GjA;e7IRmEgs23Sg6bN~wX64|QYu&XLQPskbz4oY7{>qaN*` z4?I9VDSBOHjG2p@@NVVIoaC9UhYpRSVgr{9p{1wC2iXeljmeDdo)ii-G4aHyQ$T-V z`NC;B19w{TJ)Q!YQ zvHcB91*UmI_6W|qy8-gqjFt0&ag-3*qAp#EjAa$ljWaB+m^k?IZ4&#=tYkxR)aw1rI0)%7?Px3S2wyr7 z^oJ9^rxf}NR9^7?(SN~-$ETqL+A?RI0ooy{I53D34^ehrP>QjWdlEf3E3pDaX&q|S^f42Opd6^R{|f7C}2 zZ$l0WRv=miSjr(_hWIBpx5Zf*;wUt~;A4Vq2RD(on_Gu#mDK47Zxcqh!x1?-9a>UC zgOALj@0zxM`{r+A67f#5Z{%OKGzI(O_TjkLaQo`8hv&01 z%VT5dWMoq6w+mk8+;z1jnmu#fT#T{+2Zo~@u3rDLsCa)JfsO5HmGXXi|J39tEAxa_ z7vU-b6N8YjfyDb7OHnw#GMFUJFSO-cR10qpzjB<&^B`M~%i3E1-Pcm7y0A;wS4-r5 zG;Qo-3y2ZNS9CDKD2g@UBX_JtIv@y2PIn!c=VUj=Jh%1nZFOK~oojhUmDxsbVnU5; z+d*%z#g7TiQ6>g&VF{29c3o?`s21>1OoXN(;z*YsEsKl_7&+PjTZ=n?wpMfjQ6lXE z^Tmr|2UHlceNV+K`0seqG4(2Y3xnQ@Y}s&yRA$6A98ZJxyYblL0Xw;*b%dB!(K|Ra zo}jjVAC4?nGBzG5i!^t0)3@g29%*#uk%*`!IqZwb6W4N=3u4j{F*a^#iw=8yn4VQ! zl7XFHKR~nQ=BQ${vXC}YdraiTwL@CwEUYUZnp_$2nd<5|RHhv}Z1yr+WsH;=d1NR? zW(lU8^;;)pa6;YK#KPY~G}b@7nY3{q@%Zs~+vb{=SF|5pSv4?#)3Z)d5j>93?##~@ zg|^UhFe%uD)pGLWM>LaQNXj?yndIhP%v{at`%^sqr`Fcg z8rca11VZ^aw9}l*wqnXbDB06`Y4f`YP8L==cXt6bCU0R`mB3AQ`wY!lhO}m-rJ3a9 zU6zhFo=D*qFchdNSK6Ax+5GElE$99X3Q;9{A((4Ck^3M^oqHX7#Q}WS-jLtIho2A~ z9sl(T6+)>!!}rft`2y=)SXslv8C<4p@rt;XFiufi;gG_shNh<5e}=3#5Y88vJ2eb< z`|QVxfR8P)Q^%m-*i%L?&OXH>Y;O;VLXzm`J0-5)rs>qwDl1!XPgIG=Av(`c#D}k4 zi`PUtg)%ZRWGHnyFf%DQadI#bnctQ%aLo+I$nSOjxQBK~BJ^wL-raZh;(UE;w9IJC z)>fY)yZAFQUt(ydvc3VGhDVrDOzvN7-Wzz1Jd>`h6pOb?2^OYbt3m+sV{YyapdaOq zn3vMsD9m5!%DC_;er3smD5JjG>rGg$7(T$9p+j|S?rrN6PI~&;K5>J%_|blq{>Ixf zFN+T;JHIv6JWjNyc5S;!r*JmKHiu)mzPE3|XQ>gCDI&a}L*L$4Ks?fPK zo^VdMCZl{2{FEUrDHB8bH@6wIPvS;2wiL@IIoP)@&fOWmx;SnHfk~M|xM{ls+ua_@ z$Y(AYYyBOhp`B7~8H&oj68-)EehEWMlCaNrrRA@9zsh?r*D!INU7DZk6DRR2MHxim z=YjNfh_}Y9cVk6fAu}<;|z@@pK%^0Qi{_8J#)jU_KzJZaNdWG-Z6WOtiq`B%`y z)%PbphTV^PQ9?W4p4=~~M>nx>p4Iz39lk5>(&org1&@KKTFz{UKPUbBn}ofEDd|~k z@4Jo6S$aOuK174+jt`mUz`}W9jlchhBBQQ|-q}j!{yXbzZD%tgcpp6A<|BqK)7`!u zU}cb;#EH+9-Wqm4eJ;aLBAR=EN;mR-SX{69{W-abd6)Y<0@}A~b0$8H(iNDtj&a+&PB~a}XeSHs7yz)Wtn3U8 zVUB3Iamd-3Ff>Ga-M+#W>UCSF!*=c}3VO^N5q3>x@Pa~y@` z=`CRWBy%MQM%VK395vNS5Fp(0jtTiy__cT`j?J!Fq_2E^@}ngIH8q^J#zwRT@v4q) zJ)_?%m511|b`}buBX#<;W+0#IL2(Is?+u0#VzbY-=U(k&*!v{EElC)w{-32Z!1{7T zou=l=Qkj=&(y1If4`LRcH9?y*$a#0Msh^%Wu`V`C9FkBNz<--MG{x&#|L zhk{-_qi!@)jA+b*w|(>p6Y68 zyNnt_EEqbTk{fw$t;%K2Bi)93GW@gI-t^MV%%GOxF_cit*H(Q-TVQQ#_LiQZq}p>{ zc$(idFdylrj|{KnOA`sl3kmr3w@>)0ZimMd$K7$sZr|o!ZKCAyL(5h!o4jgisnSno zXlIk@Nev=n>&E7=SXNwtK(?nxItZ0s!gltpZPAdc)}Gs#p1}kmY|!^_cX{0NT_`Mg zxU^3}qKX%9^;3IvnZ2*iEmoapQ>vw8Mr!!1PjRuBm+JGrwq(7wLW|k??f|P)xjm&} zb8k^~$Sddc-r(dsZW%Do)YcyKQ~Cste`??MblPqRjJfgt$7jVVDJ1`sZP$0{=Z%z^ z{*`M3c`wdNE4_qQt#%N98@j+2pgDMNkkVy8s_sh2RAuZdj~;(GdY`wkX!*j3Gc`Wa z@4dbegZGA=)GR?`vv#N;SAGRpEp0q~y3&nxaS=cq+=U-}&8x7|S2VX#Nh1@cxd%-@ z4@N$|1c77ajW&n4=dM`KYulkB&Wfu&_xsv)Rw!!w1x`-4IIvl4H?B{t+b#-~8FsR9 z%f=!CLElsHQ5GX7C(hl_&O#w4r_4>PA!mr{O@z6qnTS$dJ7xw1ihq5uKU z`}6CeM`mV=s(B}#FcQPnj&xmj@y)ZrJx&OVX3wkUJ)&|i$-tOsY}%GF(~bVG;l`*6i9dG__C))`nQ; zrdQC^_`}Me%|g0thY#ofUM(f+;zDPZ91+7Tur9L1{glItzP>%Sw#Z}3i;AM}y@j@F z*L7Qj(y->jPzd<~eh?v_l(F5tx~?uPaTSp%Ze?$Ze@yb19a|(1Dui_{$(~r?rrkMR z<^tOM`yEHWed^x&4(%-@O5~7bP2>hp`ontyW!UKNYp&69Eh8It-5`5(Ix91we1|?2 ze>^Re#T*kf4t9|*o(lNE_hu0CG?zJ7g_XJki4EF?MbPx&;i(cKe0dRU%P7E+ zqJHQ>Oj-TKu(?L5%21bS*s={$?)SFBLUFkugIh!<-$N8!09eqi)wge zB5RC^i9v?w>;_u500+}$Yov0R@8XR^o1QL3e*x_X6zn%{3`K2@R)2MMMSB)XGGN)! z=z{nIPD|qLJBL@f9cdqI$SqI8hj;6%F3A=x2uU)9xwK1Z}7uKKoD<1^M|>>B$(K(la$NEtRJq)k?F5cA6ARr$s#+ z#{@UK?cOSc&W;W#W#w6TVeI@-Q9^YP?k6<7BI3TA#W(KwIFUa#nsgE7Fl6Lz38#j*Y>!ZE9 zN=X&TXZGdG8~7gJUQkn2_37`&?yQ22fAp-+kT9IPw?G-lQg=sD78M5!44vIKqKd~DsQS`U1?0j2dK`L~LBrs#S+5(0E(gui zhujrc5)4%|TLe{HiAt8pV$pEgZD%)$={Cn+$g#7>PfvU7KWEP9MvhCU5ySvqP*_wp zZw4(GM`r-l6sb?(#;a+7l;DPer~GsWl?1I%fP5MmcL5$t6l`GG#FI03V}uLV_+d=0 zh0F^W$IY8zxin?56Xe|670kzbebX3D5NfVWMB?$MFJi!aVhYFqH`1-ZXmOd`}<2R3TH@(&+iB>?52XC ziKh`gAJoTCq22yy{0$TV08lPrx+Hiw85^CRT*#=lo{Q{$ztORNlbDzo_{E@^^ohB# z?qG|)0s9_j40y=yo}L)(7*{K?EIvRP2-(AfM#=x zh`_2g4P<5GYSIP#2R9c0R;bpaG?tNhe_2FLts3(dhz1IZia2wzwL&_0Q^msjR4iCD z;B`?Eh7jYp6Kk`*Fi^CHHmz^qraRib>t*=$*#9Aax_o&q zHY1V?5-aL+0bd%?#UdSDJD3}tT21$EXdM{%0RtS$vaC|__kxp9XwSg{3zqhenTF4^ zeG){x!GB4dj-80V!hA7#QbOId5#kCIJ0Xwd_4`)ojztX2eQ+!MF}|YlCU^WlMNAIy zJ^v6f1-Pef!ZF4B3(R3f#S;X3vWEFFD?gm~e@T{Pa&9$WL+27?a=^0Ui*9)gV$2zs z%7&1>jg8^hwm@hlyg_*k)f-sB(Pw#tsi)79&`?hj+T!Z%T>+>K1jH2;dQj`3>6f>f zHXIEc8hjxNHwYv_1jR$4m~+YRmqc6$`js%9o>BWHJBrxm+Ev_EzXYbDk@ z03)U`4X9^oj7FkT7J%!K!ZCQm67&3LAFyci>z#v)8e@LetZ~-8LGwj2y~Q^# zHvUMi^YG2EBf|>F5C$JGmIyQmA(&Zuo2*CQfBX-ksI!4;I@g6kH4T`FA?4Zm-k9< zw;P@@7?>d&k&yi*h}pY;D~0a7J2HLYzhpsZ|4a2;hDr%zGSNinIK3E2N_%96_59nn zlLq2P={5;&g9F({PUO52H9gsQ^Ozo{N8xtq>EXUGgfce1KSGN*2M(-xP`dlUl~+S= zDT&n=Qu>ppPTjL2Oi2Q@0kJivYTMi9llX(@X#_6R$^m;u`=8P&WlrW9q;C0J>%;m2 zcZ9I8E`~<{C4glGeGVR;r?1BCKcRTXj3h%NPeQ*1DD|da-(J%w!v`&eg*cBuw~o%8 zEDh-X0n{Og{@;y{qht+Y^gw5)T>|7iM#-Xk{zq9)eJKVms;j?v_3Gk%H&bKdT-h+O zC3A`-t|W-KMVPE3*9&eG&H4&UAgYg;j0i6+A`JixHaa@(-VHA2UFbC%Zr{$60P8g) z18cm==BxgxSFR-WRkBe$JoYyQ-)?RWMPvpYs;6feBtaOOdt~EXiW>qbWK9S#Z4xYG z|7QtLmKlVrG3Z&KVm-1X$NuSA2{k1-N@EPmsw9glV#pf$0dx=k8?5CR`gh=!!(W+UKU9);o6iqF0D03#}A10GAdlr%n4>S_lRy zV`HxV?L5rS=X<-mD`2U`s4}4Tv6(?02+b=H{>zg${tQvQfN5kDO4s3PY>GWRVqq-* zI;~8E6X!U4FGJ*Gre**U23qdeCPf`z{X;n8>XU*!DUhqldx{hBC1q6!W=aCH{cR-_ z-4cY>u+O7wFgHq5LqWh1ObL>joRB2!ulHxAO^aC=jRzeJU+34PCFs_}W;>>5#yDgEkB-@@2sUUl6a!4?CFK|63#(YH zHyfykGH%Tw3lp&AejAPV(0KjuAv*zV3))HAkq$}`LBIB!3h7H~k7+3kzRt>!mWzeR z;vqrF9qAV6*Vt6>IH9!|x=<&L#Rl;z8fm!K&T;AASv-Z}Ibdsx$QTbC-0b)SxI3b~&dW;BZktT&Yt^qjYLb?L%s+rp!AQ4o zOQP!rrWD8^3Ysko$rCp|P zJ+=)}PyqtoNlLr(9JT;x!0{xQ-`I8kWtP}{mG(l*K3;4jaIatzeE_>bBA#)K*<<=@ z^5H4w52{>xOokO{$k0ZTOm520cSYo8a1`F>Khw{yu~Md;I+isDxzbc0PRPDSUs))dcuq{R%41pMh)+w((Bh_4_2)k ztEBYiLt%-jEUUf6Wx4;aHl;DzoL*J5N}nyEA1)WnAOxLqAepjt`*zxF1Vpnzv-8Sd*+h-_H9Al0B1?=*uKeIObE++dbpLJO-6aw*I#;LcXn zrzb!^aT(w@h_T5IGe)S6{aavyfBPpk`k?HJ38TAa{01ZlydJx28v;7a zs{VpN6o?kAw*l_r{9C2fkfR}9Ua5J)K6l&qEoQ^sLsYWg(Q&R%;wViPj~XGNzt%ek zL>3%^@5XDxXSj)29JgS8D5RnYbLTRQjFC12c#1d=f;Q4QPNg&gM1}a8H02di=*U|B zU@<605hJ5e@lVYMQUEP%6wv9@rW+U=cfhAKn_;vca`m+$BEZ#$oH}*t&33MjoUolC z7YFVLt#+b8$ZJaxRnZ;BStxvB3+G+E`X(q$_(+d8b*WtznCtctd#mG}Ky@W0>&gpR zh3r^7PC=@HSus#X^WMG{i2DZD34@}V0fqxZ<-Smer5(OB`vx^vLP~1tD?GOWduGKe!IP^(+DWo;Kss02E;w^}8;B;{wETC{dqcSc`1W&)f%aG?I)qwn-;7p;^ z0q6u>iT}fEn7j-gReeJPm@AlsjR%H|Im-9m=Jhj9nOBh5A#cX~Ff5-?M<5)-iGc!m zztWmcC4`tbb-#Z7VpQXTVFNqRDbPgY9CJBS6Ycb&OCklQ#dSxq97e){fxk;XejuoU z@<2sZ^*9y_guAHC;RgaSw<;(n_ZfC#W=Q}91YTZVfq_~v?Wd8?!_EfeD{M*N<@J_) zyEVp`X!>_?4?|Y}$Qa_+pzEy!r1SB2=Ew@bGU1P3pJ~J`=Yc&F_!)czwnqFQlHWWW zOhf!)7s4+oA<(^_Cmj|52<^he3Lf z9(0WQplSdxPxt$Ij7i5$jvXxhK89q`rXb>uI&ZlfGM~8swC*G3Un3j?I9Fa?9yLyB z%@n{&UPEo7Tw1q=Wlh|_gb5G|natk5a?)&h14^Equ4Q&r^aNZ)MB5M!;!^Cew_k#@ z2Wd6TSeO_BK}%oX)#Bp*YuiQf6kuz^@&zOA;cA4+kmjD{619#xep-qiA_B(mUC><* zWaZ@K&?e@5cm}-$4is)wyce__Lqiz+WM0qtvSx6gj^$~`lDuf&#?}b!pMrQGw zTvzb2g6=R?&luBFP(OL{gwtDGiqht+-0uPLz+DHHSf7-oMUmtD2`F#c9SchtvuP{iJAY?uStPMX1Mh?>Qvv_tj}5U961PXvZ1f)a6eus&m!uE z%_KZDV>tph7Qdn6c0+E|Bv83%S|~^D64|8G*Oc4{ShQYlu;7$e3O=!)Y*Lr6hnaIy zQpHA3Na^qcjBp(7p#53XNKgd<0qc_#)2#@xBGd~1H-9}J${A=>f4M;KFabXnCf3H~ IhRzZH2Wo5Jk^lez diff --git a/book/images/critical-path-examples.png b/book/images/critical-path-examples.png index 63b0e330e430fa49e294f765cded36b4cbff8158..7ba6906978a42758beab4e4f6ab0a05ed013cb92 100644 GIT binary patch literal 42278 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
  • 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�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 N@O1TaS?83{1OUm0Kpp@9 diff --git a/book/images/intervals-overlap-cases-owned.png b/book/images/intervals-overlap-cases-owned.png new file mode 100644 index 0000000000000000000000000000000000000000..cb259a2fdaec4bda406caefd4ebd0eff9eebe235 GIT binary patch literal 14624 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

    NYu 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 literal 0 HcmV?d00001 diff --git a/book/images/intervals-overlap-cases.jpg b/book/images/intervals-overlap-cases.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d25c41b1f53bb20631a30ffc603516e3fd4bed87 GIT binary patch literal 203740 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

    jBp5^;l!*u%y-n! zA7Kom^9+f$sdZ1j<6)2^&w&|_nFlBJ2VP+I*EAFmxE2k<)uo&&Jt*(T?~Sfu?gS|@ zU^BST8zi*?mhzb&NJclOP7SiF>B*vli{JJ|(UHq%jS}&C{ns8=+H1N)@$nDE|Wb=qHf5 zQp#NJWDCqv&1za0*!&IRKvKyHm>wBvdX-qgrO|_L$diFTzF`)*NhuP60YTgv_5NTb z3tW55<3GJvpPd1iK9Sqh9<}|n_5Na;?|F8Lr4|@020+H5<|4sfSxT(%(vHixe$eFR zyxbRNsM=;xO`}HMMh(2KAg0{|w;mWb`+mcSJVo4X3Col3e~({0tO!gox@*S~lAp_@ z+`#?D?8o!^&eaXQFd4+iubJ;khjQg_(Vf5$eE@tAQ(!!q!6%WcJzjo(s$%zc>^%GY;Wk?2u#g4u4`J{2&s%IjXHIZY|Q_VRp3+_ToutcE+? z#v;i!f}7bpPxTQs!X;Bq^{jj_r*xxD^ zrB$Bqk6V^UvcD4q{PG2LMCt(@crvzC>hl0wHweySGYICJQ_ww5UG2smk*zH4rf+`3 zTP7eZ=yB~?omkAtQ0@=lpWTp>JF5;lmYXupJv<|o#R4)7m5n&LPsu#X-^Zs0$z-uw zV#Tv#%#$QtW7gt#QG#*N;mAde>SGj^Q9l@`=I!f%wTNQiA6maIRQrmlz~XvbBnIQ{ z2lj^IZ)>5Ov8bNkWxkoMIS||QkhZqHrPpYPakBJOw``g`M6m!PH~t`z2JIMRBzLgL zrmsG_JKvjcZF%Wz4Rjc-CZBn}2_lEJ=9su+alJX=7Z`8VqK=k~LhMgGEU1^fx+2IV|I^gru`Q_}JZo-gx}qgXxnR*?9tI3IiWvHL#xSFzU5 zut;sLPnJf*#4D3uY?;#LN3TVezM!AP->tH*X$p6do!_eK`G16=YTRY-ebT&TqnX<1Zo%Ely<_`~Qhf)NeYI%2!;o+!zj)|i4nu=s(%BE5%WsT#1c_6Qn&vhIo_C*xj{aUE>E%UiV^E6 z7A{-N&Ie1Dvf5IH&pZgLIdTM5-xrxCn;!H^nPEPRB`sP5my3%17w!$b(W@1-4-y?+ zocp-U#vzQ7pH*p@-f5c+ghI>)<}Ke%qi#;S&cwc=AG=54TZn5%>7RafsES!D*^<;| z0-lE;Rl{h9(xSrD$$VlUt;0@PaCrF(u8pT zFj4;x4Gj2le*qq$RXhB3*5ZHDE#Yqx47>i?+PNEJu^|`ZB2bL7`U7!Xy@D$ z9`z$Z(YVcw42ow+i_8B}eb6@=9$J2O zAcS5P5G7VUz~8+{>sx1kq-VyaDtUg`hBmlb7>|>2%jbwnfh@(<*#<_B9~~)baed%C z&wJqgZ5p~iehw#)y!v-U6=c5o#wz7$Ab>LX)Yq0+NM~Bpq1V>C`Va?Zzu0sj&Cg-~ z=VWcjnW=MX*7~0LV99%-gfy|s56!;-7EG<+lpyT;J0MpBgVE_OC diff --git a/book/images/recursive-fibonacci-call-tree.png b/book/images/recursive-fibonacci-call-tree.png index 9e18a2ab7e050308393102aa9cc8922d5c0a7baf..380ffa1343f49c6ccaf76a5cb6aae788d963169b 100644 GIT binary patch literal 49993 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%0Dq?o%c)^!oBrA2&6E*^ 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 Yr8BcFzjC?92nGJhN-9c}i5d9*KL_kY%m4rY From 57b6eb9f1091132f9c32e4b62c50c0b96eac729c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 11 Sep 2020 20:43:11 +0000 Subject: [PATCH 142/200] :bookmark: chore(release): 2.1.0 # [2.1.0](https://github.com/amejiarosario/dsa.js/compare/2.0.0...2.1.0) (2020-09-11) ### Features * **book/sorting:** add questions and solutions ([fdb8bd8](https://github.com/amejiarosario/dsa.js/commit/fdb8bd8af644ddeaa07ce62773e9be96fd6b2404)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36af93c4..88082ee9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.1.0](https://github.com/amejiarosario/dsa.js/compare/2.0.0...2.1.0) (2020-09-11) + + +### Features + +* **book/sorting:** add questions and solutions ([fdb8bd8](https://github.com/amejiarosario/dsa.js/commit/fdb8bd8af644ddeaa07ce62773e9be96fd6b2404)) + # [2.0.0](https://github.com/amejiarosario/dsa.js/compare/1.18.0...2.0.0) (2020-09-08) diff --git a/package-lock.json b/package-lock.json index 5b36d0f9..ecc2df64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bba73b72..786dda6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.0.0", + "version": "2.1.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From b95670899189cb5b24aedc8483107829794f6d9f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 11 Sep 2020 19:58:34 -0400 Subject: [PATCH 143/200] chore(book): improves grammar --- book/D-interview-questions-solutions.asc | 30 ++++++++++------------ book/content/part04/sorting-algorithms.asc | 16 ++++++------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 9e96a89f..e93409f5 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -803,13 +803,13 @@ graph G { The red connections are critical; if we remove any, some servers won't be reachable. -We can solve this problem in one pass using DFS. But for that, we keep track of the nodes that are part of a loop (strongly connected components). To do that, we use the time of visit (or depth in the recursion) each node. +We can solve this problem in one pass using DFS. But for that, we keep track of the nodes that are part of a loop (strongly connected components). We use the time of visit (or depth in the recursion) each node. For example C, if we start on `c0`, it belongs to group 0, then we move c1, c2, and c3, increasing the depth counter. Each one will be on its own group since there's no loop. For example B, we can start at `b0`, and then we move to `b1` and `b2`. However, `b2` circles back to `b0`, which is on group 0. We can update the group of `b1` and `b2` to be 0 since they are all connected in a loop. -For an *undirected graph*, If we found a node on our dfs, that we have previously visited, we found a loop! We can mark all of them with the lowest group number. We know we have a critical path when it's a connection that links two different groups. For example A, they all will belong to group 0, since they are all in a loop. For Example B, we will have `b0`, `b1`, and `b2` on the same group while `b3` will be on a different group. +For an *undirected graph*, If we found a node on our DFS, that we have previously visited, we found a loop! We can mark all of them with the lowest group number. We know we have a critical path when it's a connection that links two different groups. For example A, they all will belong to group 0, since they are all in a loop. For Example B, we will have `b0`, `b1`, and `b2` on the same group while `b3` will be on a different group. *Algorithm*: @@ -817,7 +817,7 @@ For an *undirected graph*, If we found a node on our dfs, that we have previousl * Run dfs on any node. E.g. `0`. ** Keep track of the nodes that you have seen using `group` array. But instead of marking them as seen or not. Let's mark it with the `depth`. ** Visit all the adjacent nodes that are NOT the parent. -** If we see a node that we have visited yet, do a dfs on it and increase the depth. +** If we see a node that we have visited yet, do a DFS on it and increase the depth. ** If the adjacent node has a lower grouping number, update the current node with it. ** If the adjacent node has a higher grouping number, then we found a critical path. @@ -863,18 +863,16 @@ The first thing we need to understand is all the different possibilities for ove // my own image image::intervals-overlap-cases-owned.png[merge intervals cases] -One way to solve this problem, is sorting by start time. That will eliminate half of the cases! - -Since A will always start before B, only 3 cases apply: -- No overlap: `[[1, 3], [4, 6]]`. -- Overlap at the end: `[[1, 3], [2, 4]]`. -- Eclipse: `[[1, 9], [3, 7]]`. +One way to solve this problem is sorting by start time. That will eliminate half of the cases! A will always start before B. Only 3 cases apply: +- No overlap: E.g.,`[[1, 3], [4, 6]]`. +- Overlap at the end: E.g., `[[1, 3], [2, 4]]`. +- Eclipse: E.g.,`[[1, 9], [3, 7]]`. *Algorithm*: * Sort intervals by start time * If the `curr`ent interval's start time is _equal_ or less than the `last` interval's end time, then we have an overlap. -** Overlaps has two cases: 1) `curr`'s end is larger 2) `last`'s end is larger. For both cases `Math.max` works. +** Overlaps has two cases: 1) `curr`'s end is larger 2) `last`'s end is larger. For both cases, `Math.max` works. * If there's no overlap, we add the interval to the solution. *Implementation*: @@ -884,12 +882,12 @@ Since A will always start before B, only 3 cases apply: include::interview-questions/merge-intervals.js[tags=description;solution] ---- -For the first interval, it will be added straight to the solution array. For all others, we will do the comparison. +For the first interval, it will be added straight to the solution array. For all others, we will make a comparison. *Complexity Analysis*: -- Time: `O(n log n)`. Standard libraries has a sorting time of `O(n log n)`, then we visit each interval in `O(n)`. -- Space: `O(n)`. In the worst-case is when there's no overlapping intervals. The size of the solution array would be `n`. +- Time: `O(n log n)`. Standard libraries have a sorting time of `O(n log n)`, then we visit each interval in `O(n)`. +- Space: `O(n)`. In the worst-case is when there are no overlapping intervals. The size of the solution array would be `n`. @@ -902,9 +900,9 @@ For the first interval, it will be added straight to the solution array. For all [#sorting-q-sort-colors] include::content/part04/sorting-algorithms.asc[tag=sorting-q-sort-colors] -We are asked to sort an array with 3 possible values. If we use the standard sorting method `Array.sort`, that will be `O(n log n)`. However, we are asked to solve in linear time and constant space complexity. +We are asked to sort an array with 3 possible values. If we use the standard sorting method `Array.sort`, that will be `O(n log n)`. However, there's a requirement to solve it in linear time and constant space complexity. -The concept on quicksort can help here. We can choose 1 as a pivot and move everything less than 1 to the left and everything bigger than 1 to the right. +The concept of quicksort can help here. We can choose `1` as a pivot and move everything less than 1 to the left and everything more significant than 1 to the right. *Algorithm*: @@ -922,7 +920,7 @@ The concept on quicksort can help here. We can choose 1 as a pivot and move ever include::interview-questions/sort-colors.js[tags=description;solution] ---- -We are using the destructive assigment to swap the elements. Here's another version a little bit more compact. +We are using the destructive assignment to swap the elements. Here's another version a little bit more compact. [source, javascript] ---- diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 5a6054c7..4f2b8c0c 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -5,8 +5,8 @@ endif::[] === Sorting Algorithms -Sorting is one of the most common solutions when we want to extract some insights about a collection of data. -We can sort to get the maximum or minimum value and many algorithmic problems involves sorting data first. +Sorting is one of the most common solutions when we want to extract some insights about data. +We can sort to get the maximum or minimum value, and many algorithmic problems can benefit from sorting. .We are going to explore three basic sorting algorithms _O(n^2^)_ which have low overhead: - <> @@ -21,15 +21,15 @@ Before we dive into the most well-known sorting algorithms, let's discuss the so ==== Sorting Properties -Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences so we can be aware of the side-effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting while others can do it in place. +Sorting implementations with the same time complexity might manipulate the data differently. We want to understand these differences to be aware of the side effects it will have on data or extra resources they will require. For instance, some solutions will need auxiliary memory to store temporary data while sorting, while others can do it in place. -Sorting properties are stable, adaptive, online and in-place. Let's go one by one. +Sorting properties are stable, adaptive, online, and in-place. Let's go one by one. ===== Stable (((Sorting, stable))) An ((stable sorting)) algorithms keep the relative order of items with the same comparison criteria. -This especially useful when you want to sort on multiple phases. +This incredibly useful when you want to sort on multiple phases. .Let's say you have the following data: [source, javascript] @@ -82,7 +82,7 @@ Both results are sorted by `age`; however, having a stable sorting is better if ===== In-place (((Sorting, in-place))) An ((in-place sorting)) algorithm would have a _space complexity_ of O(1). In other words, it does not use any other auxiliary memory because it moves the items in the collection itself. -No requiring extra memory for sorting is especially useful for memory constraint environments like robotics, smart devices, or embedded systems in appliances. +No extra memory for sorting is especially useful for large amounts of data or in memory constraint environments like robotics, smart devices, or embedded systems in appliances. ===== Online (((Sorting, online))) @@ -111,7 +111,7 @@ include::quick-sort.asc[] <<< ==== Summary -We explored many algorithms some of them simple and other more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online and adaptive. +We explored the most common sorting algorithms, some of which are simple and others more performant. Also, we cover the properties of sorting algorithms such as stable, in-place, online, and adaptive. (((Tables, Algorithms, Sorting Complexities))) (((Tables, Algorithms, Sorting Summary))) @@ -162,7 +162,7 @@ We explored many algorithms some of them simple and other more performant. Also, // end::sorting-q-merge-intervals[] -// _Seen in interviews at: X._ +// _Seen in interviews at: Facebook, Amazon, Bloomberg._ *Starter code*: From 69fa96b187ea061056273cdea7c5e26cf46e656f Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Mon, 21 Sep 2020 20:53:16 -0400 Subject: [PATCH 144/200] chore: new exercise --- jest-all.config.js | 4 ++++ lab/exercises/10-mixed/document-distance.js | 23 +++++++++++++++++++ .../10-mixed/document-distance.spec.js | 20 ++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 jest-all.config.js create mode 100644 lab/exercises/10-mixed/document-distance.js create mode 100644 lab/exercises/10-mixed/document-distance.spec.js diff --git a/jest-all.config.js b/jest-all.config.js new file mode 100644 index 00000000..d7ad87ae --- /dev/null +++ b/jest-all.config.js @@ -0,0 +1,4 @@ +module.exports = { + name: 'dsa.js', + // testPathIgnorePatterns: ['/node_modules/', '/dist/', '/lab/', '/benchmarks/', '/coverage/'], +}; diff --git a/lab/exercises/10-mixed/document-distance.js b/lab/exercises/10-mixed/document-distance.js new file mode 100644 index 00000000..4c0ca542 --- /dev/null +++ b/lab/exercises/10-mixed/document-distance.js @@ -0,0 +1,23 @@ + +// npx jest lab/exercises/10-mixed/document-distance.spec.js --watch -c 'jest-all.config.js' + +/** + * Find the distance between two documents. + * + * Convert files into vectors of words where the value is the frequency. + * Calculate the angle of the two vectors: cos α = v1 · v2 / |v1| * |v2| + * @param {string} file1 - String of words separated by whitespace + * @param {string} file2 - String of words separated by whitespace + */ +function documentDistance(file1, file2) { + // 0. slip words + // 1. calculate freq of each word per file + const byCounter = (map, w) => map.set(w, 1 + (map.get(w) || 0)); + const f1 = file1.split(' ').reduce(byCounter, new Map()); + const f2 = file2.split(' ').reduce(byCounter, new Map()); + // 2. multiply each occurence and divide it + const dotProd = (m1, m2) => [...new Set([...m1.keys(), ...m2.keys()])].reduce((sum, w) => sum + (m1.get(w) || 0) * (m2.get(w) || 0), 0); + return Math.acos(dotProd(f1, f2) / Math.sqrt(dotProd(f1, f1) * dotProd(f2, f2))); +} + +module.exports = { documentDistance }; diff --git a/lab/exercises/10-mixed/document-distance.spec.js b/lab/exercises/10-mixed/document-distance.spec.js new file mode 100644 index 00000000..67adfb70 --- /dev/null +++ b/lab/exercises/10-mixed/document-distance.spec.js @@ -0,0 +1,20 @@ +const { documentDistance } = require('./document-distance'); + +describe('documentDistance', () => { + it('should work with different files', () => { + const file1 = 'This is a cat.'; + const file2 = 'This is a dog.'; + expect(documentDistance(file1, file2)).toBeCloseTo(0.722); + }); + + it('should work with different files', () => { + const file1 = 'This is a cat.'; + const file2 = 'Occaecat irure enim sint cupidatat id cillum cupidatat ipsum officia ea reprehenderit eiusmod voluptate. Est in laboris esse anim tempor sit in labore eiusmod consectetur aliqua. Quis nulla sunt incididunt magna velit in reprehenderit officia ut esse. Duis proident aute sint laborum consectetur eu reprehenderit amet et esse esse deserunt.'; + expect(documentDistance(file1, file2)).toBeCloseTo(1.57); + }); + + it('should work with equal files', () => { + const file1 = 'This is a cat.'; + expect(documentDistance(file1, file1)).toEqual(0); + }); +}); From 2e778268c4c6a2e509cc33b1c473b26788af2e9c Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 27 Sep 2020 13:52:19 -0400 Subject: [PATCH 145/200] chore: placeholder for exercises --- book/content/part04/divide-and-conquer.asc | 90 +++++++++++++++++++--- 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/book/content/part04/divide-and-conquer.asc b/book/content/part04/divide-and-conquer.asc index a3820b72..76bb376d 100644 --- a/book/content/part04/divide-and-conquer.asc +++ b/book/content/part04/divide-and-conquer.asc @@ -66,15 +66,15 @@ graph G { "fib(2)**" -- { "fib(1)****", "fib(0)**" } // red colors - "fib(0)*" [color="#FF5252"]; - "fib(0)**" [color="#FF5252"]; - "fib(1)*" [color="#FF5252"]; - "fib(1)**" [color="#FF5252"]; - "fib(1)***" [color="#FF5252"]; - "fib(1)****" [color="#FF5252"]; - "fib(2)*" [color="#FF5252"]; - "fib(2)**" [color="#FF5252"]; - "fib(3)*" [color="#FF5252"]; + "fib(0)*" [color="#FF5252" label="fib(0)"]; + "fib(0)**" [color="#FF5252" label="fib(0)"]; + "fib(1)*" [color="#FF5252" label="fib(1)"]; + "fib(1)**" [color="#FF5252" label="fib(1)"]; + "fib(1)***" [color="#FF5252" label="fib(1)"]; + "fib(1)****" [color="#FF5252" label="fib(1)"]; + "fib(2)*" [color="#FF5252" label="fib(2)"]; + "fib(2)**" [color="#FF5252" label="fib(2)"]; + "fib(3)*" [color="#FF5252" label="fib(3)"]; } .... @@ -94,3 +94,75 @@ Those who cannot remember the past are condemned to repeat it. For these cases when subproblems repeat themselves, we can optimize them using <>. Let's do that in the next section. + + + + + +// But before doing dynamic programming. Let's do this divide and conquer exercises. + +// ==== Practice Questions +// (((Interview Questions, Divide and Conquer))) + + + + + +// // https://leetcode.com/problems/merge-k-sorted-lists/ + +// // tag::divide-and-conquer-q-FILENAME[] +// ===== TITLE + +// *DC-1*) _._ + +// // end::divide-and-conquer-q-FILENAME[] + +// // _Seen in interviews at: X._ + +// *Starter code*: + +// [source, javascript] +// ---- +// include::../../interview-questions/FILENAME.js[tags=description;placeholder] +// ---- + +// *Examples*: + +// [source, javascript] +// ---- +// FN([]); // 3 (EXPLANATION) +// ---- + + +// _Solution: <>_ + + + + +// // https://leetcode.com/problems/search-a-2d-matrix-ii/ + +// // tag::divide-and-conquer-q-FILENAME[] +// ===== TITLE + +// *DC-2*) _._ + +// // end::divide-and-conquer-q-FILENAME[] + +// // _Seen in interviews at: X._ + +// *Starter code*: + +// [source, javascript] +// ---- +// include::../../interview-questions/FILENAME.js[tags=description;placeholder] +// ---- + +// *Examples*: + +// [source, javascript] +// ---- +// FN([]); // 3 (EXPLANATION) +// ---- + + +// _Solution: <>_ From 68c73d4c3bb5fb1ec637d81b42a2f8dbfc4f0008 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Tue, 29 Sep 2020 16:07:28 -0400 Subject: [PATCH 146/200] feat(book/big-o): add new chapter on how to determine big o from code. --- book/content/part01/algorithms-analysis.asc | 77 +++--- book/content/part01/big-o-examples.asc | 78 ++++--- book/content/part01/how-to-big-o.asc | 221 ++++++++++++++++++ book/images/big-o-recursive-example.png | Bin 0 -> 44967 bytes book/images/big-o-running-time-complexity.png | Bin 0 -> 79243 bytes book/images/fib(4) example.png | Bin 0 -> 20627 bytes book/images/recursive-fibonacci-call-tree.png | Bin 49993 -> 41935 bytes book/part01-algorithms-analysis.asc | 6 +- 8 files changed, 309 insertions(+), 73 deletions(-) create mode 100644 book/content/part01/how-to-big-o.asc create mode 100644 book/images/big-o-recursive-example.png create mode 100644 book/images/big-o-running-time-complexity.png create mode 100644 book/images/fib(4) example.png diff --git a/book/content/part01/algorithms-analysis.asc b/book/content/part01/algorithms-analysis.asc index 52f57c03..d06b0a4f 100644 --- a/book/content/part01/algorithms-analysis.asc +++ b/book/content/part01/algorithms-analysis.asc @@ -8,7 +8,7 @@ endif::[] You are probably reading this book because you want to write better and faster code. How can you do that? Can you time how long it takes to run a program? Of course, you can! [big]#⏱# -However, if you run the same program on a smartwatch, cellphone or desktop computer, it will take different times. +However, if you run the same program on a computer, cellphone, or even a smartwatch, it will take different times. image::image3.png[image,width=528,height=137] @@ -17,8 +17,8 @@ That's what *time complexity* is for! But, why stop with the running time? We could also compare the memory "used" by different algorithms, and we call that *space complexity*. -.In this chapter you will learn: -- What’s the best way to measure the performance of your code regardless of what hardware you use. +.In this chapter, you will learn: +- What’s the best way to measure your code's performance regardless of what hardware you use. - Learn how to use Big O notation to compare algorithms. - How to use algorithms analysis to improve your programs speed. @@ -43,15 +43,22 @@ function makePizza(dough, toppings = ['cheese']) { } ---- -If you play a game, you are devising strategies (or algorithms) to help you win. Likewise, algorithms in computers are a set of instructions used to solve a problem. +If you play a game, you'll devise strategies (or algorithms) to win. Likewise, algorithms in computers are a set of instructions used to solve a problem. -TIP: Algorithms are instructions on how to perform a task. +TIP: Algorithms are the steps on how to perform a task. ==== Comparing Algorithms (((Comparing Algorithms))) Not all algorithms are created equal. There are “good” and “bad” algorithms. The good ones are fast; the bad ones are slow. Slow algorithms cost more money to run. Inefficient algorithms could make some calculations impossible in our lifespan! -To give you a clearer picture of how different algorithms perform as the input size grows, take a look at the following problems and how their relative execution time changes as the input size increases. +Let's say you want to compute the shortest path from Boston to San Francisco. Slow algorithms can take hours or crash before finishing. On the other hand, a "good" algorithm might compute in a few seconds. + +Usually, algorithms time grows as the size of the input increases. For instance, calculating the shortest distance from your house to the local supermarket will take less time than other destination thousands of miles away. + +Another example is sorting an array. A good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. +Organizing 1 million elements with merge sort could take 20 seconds, for instance, while selection sort takes 12 days, ouch! The fantastic thing is that both programs solve the same problem with comparable data and hardware; yet, there's a big difference in time! Bad algorithms would perform poorly, even on a supercomputer. + +To give you a clearer picture of how different algorithms perform as the input size grows, look at the following problems and how their relative execution time changes as the input size increases. (((Tables, Intro, Algorithms input size vs Time))) .Relationship between algorithm input size and time taken to complete @@ -65,32 +72,28 @@ To give you a clearer picture of how different algorithms perform as the input s |Finding string permutations |4 sec. |> vigintillion years |> centillion years |∞ |∞ |============================================================================================= -Most algorithms are affected by the size of the input (`n`). Let's say you need to arrange numbers in ascending order. Sorting ten items will naturally take less time than sorting out 2 million. But, how much longer? As the input size grow, some algorithms take proportionally more time, we classify them as <> runtime [or `O(n)`]. Others might take power two longer; we call them <> running time [or `O(n^2^)`]. - -From another perspective, if you keep the input size the same and run different algorithms implementations, you would notice the difference between an efficient algorithm and a slow one. For example, a good sorting algorithm is <>, and an inefficient algorithm for large inputs is <>. -Organizing 1 million elements with merge sort takes 20 seconds while selection sort takes 12 days, ouch! -The amazing thing is that both programs are solving the same problem with equal data and hardware; and yet, there's a big difference in time! +As you can see in the table, most algorithms on the table are affected by the input size. But not all and not at the same rate. Finding out if a number is odd will take the same if it is 1 or 1 million. We say then that the growth rate is constant. Others grow very fast. Finding all the permutations on a string of length 10 takes a few seconds, while if the string has a size of 100, it won't even finish! -After completing this book, you are going to _think algorithmically_. -You will be able to scale your programs while you are designing them. -Find bottlenecks of existing software and have an <> to optimize algorithms and make them faster without having to pay more for cloud computing (e.g., AWS EC2 instances). [big]#💸# +After completing this book, you are going to _think algorithmically_. You will be able to tell the growth rate of your programs and scale them. You'll find bottlenecks of existing software and have an <>. <<< ==== Increasing your code performance -The first step to improve your code performance is to measure it. As somebody said: +The first step to improve your code performance is to learn how to measure it. As somebody said: (((quotes))) [quote, H. J. Harrington] Measurement is the first step that leads to control and eventually to improvement. If you can’t measure something, you can’t understand it. If you can’t understand it, you can’t control it. If you can’t control it, you can’t improve it. -In this section, we are going to learn the basics of measuring our current code performance and compare it with other algorithms. +This section will learn the basics of measuring our current code performance and compare it with other algorithms. ===== Calculating Time Complexity (((Time complexity))) -Time complexity, in computer science, is a function that describes the number of operations a program will execute given the size of the input `n`. +In computer science, time complexity describes the number of operations a program will execute given the size of the input `n`. -How do you get a function that gives you the number of operations that will be executed? Well, we count line by line and mind code inside loops. Let's do an example to explain this point. For instance, we have a function to find the minimum value on an array called `getMin`. +How do you get a function that gives you the rough number of operations that the CPU will execute? + +One idea is to analyze your code line by line and mind code inside loops. Let's do an example to explain this point. For instance, we have a function to find the minimum value on an array called `getMin`. .Translating lines of code to an approximate number of operations image::image4.png[Operations per line] @@ -101,17 +104,17 @@ _3n + 3_ `n` = input size. -That means that if you have an array of 3 elements e.g. `getMin([3, 2, 9])`, then it will execute around _3(3)+3 = 12_ operations. Of course, this is not for every case. For instance, Line 12 is only executed if the condition on line 11 is met. As you might learn in the next section, we want to get the big picture and get rid of smaller terms to compare algorithms easier. +That means that if you have an array of 3 elements, e.g. `getMin([3, 2, 9])`, then it will execute around _3(3)+3 = 12_ operations. Of course, this is not for every case. For instance, Line 12 is only executed if the condition on line 11 is met. As you might learn in the next section, we want to get the big picture and get rid of smaller terms to compare algorithms easier. ==== Space Complexity (((Space Complexity))) Space complexity is similar to time complexity. However, instead of the count of operations executed, it will account for the amount of memory used additionally to the input. -For calculating the *space complexity* we keep track of the “variables” and memory used. In the `getMin` example, we just create a single variable called `min`. So, the space complexity is 1. On other algorithms, If we have to use an auxiliary array, then the space complexity would be `n`. +For calculating the *space complexity*, we keep track of the “variables” and memory used. In the `getMin` example, we create a variable called `min`, which only holds one value at a time. So, the space complexity is `1`. On other algorithms, If we have to use an auxiliary array that holds the same number of elements as the input, then the space complexity would be `n`. ===== Simplifying Complexity with Asymptotic Analysis (((Asymptotic Analysis))) -When we are comparing algorithms, we don't want to have complex expressions. What would you prefer comparing two algorithms like "3n^2^ + 7n" vs. "1000 n + 2000" or compare them as "n^2^ vs. n"? Well, that when the asymptotic analysis comes to the rescue. +When we compare algorithms, we about the growth rate when the input gets huge (towards infinity). Then you have a function like `20*n^3 + 100`. If `n` is one million. The term `+ 100` makes a tiny contribution to the result (less than 0.000001%). Here is when the asymptotic analysis comes to the rescue. TIP: Asymptotic analysis describes the behavior of functions as their inputs approach to infinity. @@ -127,37 +130,41 @@ In the previous example, we analyzed `getMin` with an array of size 3; what happ |1M |3(1M)+3 |3,000,003 |=========================== -As the input size `n` grows bigger and bigger then the expression _3n + 3_ is closer and closer to _3n_. Dropping terms might look like a stretch at first, but you will see that what matters the most is the higher order terms of the function rather than lesser terms and constants. +As the input size `n` grows bigger and bigger, then the expression _3n + 3_ is closer and closer to _3n_. Dropping terms might look like a stretch at first, but you will see that what matters the most is the higher-order terms of the function rather than lesser terms and constants. ===== What is Big O Notation? (((Big O))) -There’s a notation called *Big O*, where `O` refers to the *order of the function*. +There’s a notation called *Big O*, where `O` refers to the *order of a function* in the worst-case scenario. -TIP: Big O = Big Order of a function. +TIP: Big O = Big Order (rate of growth) of a function. If you have a program that has a runtime of: _7n^3^ + 3n^2^ + 5_ -You can express it in Big O notation as _O(n^3^)_. The other terms (_3n^2^ + 5_) will become less and less significant as the input grows bigger. +You can express it in Big O notation as _O(n^3^)_. The other terms (_3n^2^ + 5_) will become less significant as the input grows bigger. -Big O notation, only cares about the “biggest” terms in the time/space complexity. So, it combines what we learn about time and space complexity, asymptotic analysis and adds a worst-case scenario. +Big O notation only cares about the “biggest” terms in the time/space complexity. It combines what we learn about time and space complexity, asymptotic analysis, and adds a worst-case scenario. .All algorithms have three scenarios: -* Best-case scenario: the most favorable input arrangement where the program will take the least amount of operations to complete. E.g., an array that's already sorted is beneficial for some sorting algorithms. +* Best-case scenario: the most favorable input arrangement where the program will take the least amount of operations to complete. E.g., a sorted array is beneficial for some sorting algorithms. * Average-case scenario: this is the most common case. E.g., array items in random order for a sorting algorithm. * Worst-case scenario: the inputs are arranged in such a way that causes the program to take the longest to complete. E.g., array items in reversed order for some sorting algorithm will take the longest to run. To sum up: -TIP: Big O only cares about the highest order of the run time function and the worst-case scenario. +TIP: Big O only cares about the run time function's highest order on the worst-case scenario. WARNING: Don't drop terms that are multiplying other terms. _O(n log n)_ is not equivalent to _O(n)_. However, _O(n + log n)_ is. -There are many common notations like polynomial, _O(n^2^)_ as we saw in the `getMin` example; constant _O(1)_ and many more that we are going to explore in the next chapter. +There are many common notations like polynomial, _O(n^2^)_ as we saw in the `getMin` example, constant _O(1)_, and many more that we are going to explore in the next chapter. + +Again, -Again, time complexity is not a direct measure of how long a program takes to execute, but rather how many operations it performs given the input size. Nevertheless, there’s a relationship between time complexity and clock time as we can see in the following table. -(((Tables, Intro, Input size vs clock time by Big O))) +TIP: the time complexity is not a direct measure of how long a program takes to execute, but rather how many operations it performs given the input size. + +Nevertheless, there’s a relationship between time complexity and clock time, as shown in the following table. +(((Tables, Intro, Input size vs. clock time by Big O))) // tag::table[] .How long an algorithm takes to run based on their time complexity and input size @@ -172,14 +179,14 @@ Again, time complexity is not a direct measure of how long a program takes to ex |=============================================================== // end::table[] -This is just an illustration since in different hardware the times will be slightly different. -NOTE: These times are under the assumption of running on 1 GHz CPU and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. Regardless, bad algorithms would perform poorly even on a supercomputer. + +NOTE: This is just an illustration since, in different hardware, the times will be distinct. These times are under the assumption of running on 1 GHz CPU, and it can execute on average one instruction in 1 nanosecond (usually takes more time). Also, keep in mind that each line might be translated into dozens of CPU instructions depending on the programming language. ==== Summary -In this chapter, we learned how you could measure your algorithm performance using time complexity. Rather than timing how long your program takes to run you can approximate the number of operations it will perform based on the input size. +In this chapter, we learned how you could measure your algorithm performance using time complexity. Rather than timing how long your program takes to run, you can approximate the number of operations it will perform based on the input size. We learned about time and space complexity and how they can be translated to Big O notation. Big O refers to the *order* of the function. -In the next section, we are going to provide examples of each of the most common time complexities! +In the next section, we will go deeper into how to analyze time complexity and provide examples! diff --git a/book/content/part01/big-o-examples.asc b/book/content/part01/big-o-examples.asc index 3b56e1a0..73bfe968 100644 --- a/book/content/part01/big-o-examples.asc +++ b/book/content/part01/big-o-examples.asc @@ -5,7 +5,7 @@ endif::[] === Big O examples -There are many kinds of algorithms. Most of them fall into one of the eight time complexities that we are going to explore in this chapter. +There are many kinds of algorithms. Most of them fall into one of the eight-time complexities that we will explore in this chapter. .Eight Running Time Complexities You Should Know - Constant time: _O(1)_ @@ -22,9 +22,10 @@ We are going to provide examples for each one of them. Before we dive in, here’s a plot with all of them. .CPU operations vs. Algorithm runtime as the input size grows -image::image5.png[CPU time needed vs. Algorithm runtime as the input size increases] +// image::image5.png[CPU time needed vs. Algorithm runtime as the input size increases] +image::big-o-running-time-complexity.png[CPU time needed vs. Algorithm runtime as the input size increases] -The above chart shows how the running time of an algorithm is related to the amount of work the CPU has to perform. As you can see O(1) and O(log n) are very scalable. However, O(n^2^) and worst can make your computer run for years [big]#😵# on large datasets. We are going to give some examples so you can identify each one. +The above chart shows how the algorithm's running time is related to the work the CPU has to perform. As you can see, O(1) and O(log n) is very scalable. However, O(n^2^) and worst can convert your CPU into a furnace 🔥 for massive inputs. [[constant]] ==== Constant @@ -53,13 +54,13 @@ As you can see in both examples (array and linked list), if the input is a colle ==== Logarithmic (((Logarithmic))) (((Runtime, Logarithmic))) -Represented in Big O notation as *O(log n)*, when an algorithm has this running time it means that as the size of the input grows the number of operations grows very slowly. Logarithmic algorithms are very scalable. One example is the *binary search*. +Represented in Big O notation as *O(log n)*, when an algorithm has this running time, it means that as the input size grows, the number of operations grows very slowly. Logarithmic algorithms are very scalable. One example is the *binary search*. indexterm:[Runtime, Logarithmic] [[logarithmic-example]] ===== Searching on a sorted array -The binary search only works for sorted lists. It starts searching for an element on the middle of the array and then it moves to the right or left depending if the value you are looking for is bigger or smaller. +The binary search only works for sorted lists. It starts searching for an element in the middle of the array, and then it moves to the right or left depending on if the value you are looking for is bigger or smaller. // image:image7.png[image,width=528,height=437] @@ -68,15 +69,15 @@ The binary search only works for sorted lists. It starts searching for an elemen include::{codedir}/runtimes/02-binary-search.js[tag=binarySearchRecursive] ---- -This binary search implementation is a recursive algorithm, which means that the function `binarySearchRecursive` calls itself multiple times until the solution is found. The binary search splits the array in half every time. +This binary search implementation is a recursive algorithm, which means that the function `binarySearchRecursive` calls itself multiple times until the program finds a solution. The binary search splits the array in half every time. -Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call you are most likely in front of a logarithmic runtime: _O(log n)_. +Finding the runtime of recursive algorithms is not very obvious sometimes. It requires some tools like recursion trees or the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Theorem]. The `binarySearch` divides the input in half each time. As a rule of thumb, when you have an algorithm that divides the data in half on each call, you are most likely in front of a logarithmic runtime: _O(log n)_. [[linear]] ==== Linear (((Linear))) (((Runtime, Linear))) -Linear algorithms are one of the most common runtimes. It’s represented as *O(n)*. Usually, an algorithm has a linear running time when it iterates over all the elements in the input. +Linear algorithms are one of the most common runtimes. Their Big O representation is *O(n)*. Usually, an algorithm has a linear running time when it visits every input element a fixed number of times. [[linear-example]] ===== Finding duplicates in an array using a map @@ -91,19 +92,19 @@ include::{codedir}/runtimes/03-has-duplicates.js[tag=hasDuplicates] ---- .`hasDuplicates` has multiple scenarios: -* *Best-case scenario*: first two elements are duplicates. It only has to visit two elements. +* *Best-case scenario*: the first two elements are duplicates. It only has to visit two elements and return. * *Worst-case scenario*: no duplicates or duplicates are the last two. In either case, it has to visit every item in the array. -* *Average-case scenario*: duplicates are somewhere in the middle of the collection. Only half of the array will be visited. +* *Average-case scenario*: duplicates are somewhere in the middle of the collection. As we learned before, the big O cares about the worst-case scenario, where we would have to visit every element on the array. So, we have an *O(n)* runtime. -Space complexity is also *O(n)* since we are using an auxiliary data structure. We have a map that in the worst case (no duplicates) it will hold every word. +Space complexity is also *O(n)* since we are using an auxiliary data structure. We have a map that, in the worst case (no duplicates), it will hold every word. [[linearithmic]] ==== Linearithmic (((Linearithmic))) (((Runtime, Linearithmic))) -An algorithm with a linearithmic runtime is represented as _O(n log n)_. This one is important because it is the best runtime for sorting! Let’s see the merge-sort. +You can represent linearithmic algorithms as _O(n log n)_. This one is important because it is the best runtime for sorting! Let’s see the merge-sort. [[linearithmic-example]] ===== Sorting elements in an array @@ -117,7 +118,7 @@ The ((Merge Sort)), like its name indicates, has two functions merge and sort. L ---- include::{codedir}/algorithms/sorting/merge-sort.js[tag=splitSort] ---- -<1> If the array only has two elements we can sort them manually. +<1> If the array only has two elements, we can sort them manually. <2> We divide the array into two halves. <3> Merge the two parts recursively with the `merge` function explained below @@ -134,15 +135,15 @@ The merge function combines two sorted arrays in ascending order. Let’s say th .Mergesort visualization. Shows the split, sort and merge steps image::image11.png[Mergesort visualization,width=500,height=600] -How do we obtain the running time of the merge sort algorithm? The mergesort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work is *O(n log n)*. There are more formal ways to reach this runtime, like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. +How do we obtain the running time of the merge sort algorithm? The merge-sort divides the array in half each time in the split phase, _log n_, and the merge function join each splits, _n_. The total work is *O(n log n)*. There are more formal ways to reach this runtime, like using the https://adrianmejia.com/blog/2018/04/24/analysis-of-recursive-algorithms/[Master Method] and https://www.cs.cornell.edu/courses/cs3110/2012sp/lectures/lec20-master/lec20.html[recursion trees]. [[quadratic]] ==== Quadratic (((Quadratic))) (((Runtime, Quadratic))) -Running times that are quadratic, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. +Quadratic running times, O(n^2^), are the ones to watch out for. They usually don’t scale well when they have a large amount of data to process. -Usually they have double-nested loops, where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. +Usually, they have double-nested loops, where each one visits all or most elements in the input. One example of this is a naïve implementation to find duplicate words on an array. [[quadratic-example]] ===== Finding duplicates in an array (naïve approach) @@ -165,34 +166,37 @@ Let’s say you want to find a duplicated middle name in a phone directory book ==== Cubic (((Cubic))) (((Runtime, Cubic))) -Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. An example of a cubic algorithm is a multi-variable equation solver (using brute force): +Cubic *O(n^3^)* and higher polynomial functions usually involve many nested loops. An example of a cubic algorithm is a multi-variable equation solver (using brute force) or finding three elements on an array that add up to a given number. [[cubic-example]] -===== Solving a multi-variable equation +===== 3 Sum -Let’s say we want to find the solution for this multi-variable equation: +Let's say you want to find 3 items in an array that add up to a target number. One brute force solution would be to visit every possible combination of 3 elements and add them up to see if they are equal to target. -_3x + 9y + 8z = 79_ - -A naïve approach to solve this will be the following program: - -//image:image13.png[image,width=528,height=448] - -.Naïve implementation of multi-variable equation solver [source, javascript] ---- -include::{codedir}/runtimes/06-multi-variable-equation-solver.js[tag=findXYZ] +function threeSum(nums, target = 0) { + const ans = []; + + for(let i = 0; i < nums.length -2; i++) + for(let j = i + 1; j < nums.length - 1; j++) + for(let k = j + 1; k < nums.length; k++) + if (nums[i] + nums[j] + nums[k] === target) + ans.push([nums[i], nums[j], nums[k]]); + + return ans; +} ---- -WARNING: This is just an example, there are better ways to solve multi-variable equations. +As you can see, three nested loops usually translate to O(n^3^). If we had four nested loops (4sum), it would be O(n^4^) and so on. A runtime in the form of _O(n^c^)_, where _c > 1_, we refer to this as a *polynomial runtime*. -As you can see three nested loops usually translates to O(n^3^). If you have a four variable equation and four nested loops it would be O(n^4^) and so on. When we have a runtime in the form of _O(n^c^)_, where _c > 1_, we refer to this as a *polynomial runtime*. +NOTE: You can improve the runtime of 3sum from _O(n^3^)_ to _O(n^2^)_, if we sort items first and then use one loop and two pointers to find the solutions. [[exponential]] ==== Exponential (((Exponential))) (((Runtime, Exponential))) -Exponential runtimes, O(2^n^), means that every time the input grows by one the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100) otherwise it might not finish in your lifetime. [big]#💀# +Exponential runtimes, _O(2^n^)_, means that every time the input grows by one, the number of operations doubles. Exponential programs are only usable for a tiny number of elements (<100); otherwise, it might not finish in your lifetime. [big]#💀# Let’s do an example. @@ -209,21 +213,21 @@ Finding all distinct subsets of a given set can be implemented as follows: include::{codedir}/runtimes/07-sub-sets.js[tag=snippet] ---- <1> Base case is empty element. -<2> For each element from the input append it to the results array. +<2> For each element from the input, append it to the results array. <3> The new results array will be what it was before + the duplicated with the appended element. //.The way this algorithm generates all subsets is: //1. The base case is an empty element (line 13). E.g. [''] -//2. For each element from the input append it to the results array (line 16) +//2. For each element from the input, append it to the results array (line 16) //3. The new results array will be what it was before + the duplicated with the appended element (line 17) -Every time the input grows by one the resulting array doubles. That’s why it has an *O(2^n^)*. +Every time the input grows by one, the resulting array doubles. That’s why it has an *O(2^n^)*. [[factorial]] ==== Factorial (((Factorial))) (((Runtime, Factorial))) -Factorial runtime, O(n!), is not scalable at all. Even with input sizes of ~10 elements, it will take a couple of seconds to compute. It’s that slow! [big]*🍯🐝* +The factorial runtime, `O(n!)`, is not scalable at all. Even with input sizes of ~10 elements, it will take a couple of seconds to compute. It’s that slow! [big]*🍯🐝* .Factorial **** @@ -240,7 +244,7 @@ A factorial is the multiplication of all the numbers less than itself down to 1. ===== Getting all permutations of a word (((Permutations))) (((Words permutations))) -One classic example of an _O(n!)_ algorithm is finding all the different words that can be formed with a given set of letters. +One classic example of an _O(n!)_ algorithm is finding all the different words formed with a given set of letters. .Word's permutations // image:image15.png[image,width=528,height=377] @@ -251,7 +255,7 @@ include::{codedir}/runtimes/08-permutations.js[tag=snippet] As you can see in the `getPermutations` function, the resulting array is the factorial of the word length. -Factorial starts very slow, and quickly becomes uncontrollable. A word size of just 11 characters would take a couple of hours in most computers! +Factorial starts very slow and quickly becomes unmanageable. A word size of just 11 characters would take a couple of hours in most computers! [big]*🤯* ==== Summary @@ -265,7 +269,7 @@ We went through 8 of the most common time complexities and provided examples for |=== |Big O Notation |Name -|Example(s) +| example (s) |O(1) |<> diff --git a/book/content/part01/how-to-big-o.asc b/book/content/part01/how-to-big-o.asc new file mode 100644 index 00000000..3067704f --- /dev/null +++ b/book/content/part01/how-to-big-o.asc @@ -0,0 +1,221 @@ +ifndef::imagesdir[] +:imagesdir: ../../images +:codedir: ../../../src +endif::[] + +=== How to determine time complexity from code? + +In general, you can determine the time complexity by analyzing the program's statements. +However, you have to be mindful how are the statements arranged. Suppose they are inside a loop or have function calls or even recursion. All these factors affect the runtime of your code. Let's see how to deal with these cases. + +*Sequential Statements* + +If we have statements with basic operations like conditionals, assignments, reading a variable. +We can assume they take constant time. + +---- +statement 1; +statement 2; +... +statement n; +---- + +If we calculate the total time complexity, it would be something like this: + +---- +total = time(statement 1) + time(statement 2) + ... time (statement n) +---- + +Let's use `T(n)` as the total time in function of the input size `n`, and `t` as the time complexity taken by a statement or group of statements. + +---- +T(n) = t(statement 1) + t(statement 2) + ... + t(statement n); +---- + +If each statement executes a basic operation, we can say it takes constant time `O(1)`. As long as you have a fixed number of operations, it will be constant time, even if we have 1 or 100 of these statements. + +WARNING: be careful with function calls. You will have to go to the implementation and check their run time. More on that later. + +*Conditional Statements* + +Very rarely, you have a code without any conditional statement. +How do you calculate the time complexity? Remember that we care about the worst-case with Big O so that we will take the maximum possible runtime. + +---- +if (isValid) { + statement 1; + statement 2; +} else { + statement 3; +} +---- + +Since, we are after the worst-case we take the whichever is larger of the two possibilities: + +---- +T(n) = Math.max([t(statement 1) + t(statement 2)], [time(statement 3)]) +---- + +*Loop Statements* + +Another prevalent scenario is loops like for-loops or while-loops. +For any loop, we find out the runtime of the block inside them and multiply it by the number of times the program will repeat the loop. + +---- +for (let i = 0; i < array.length; i++) { + statement 1; + statement 2; +} +---- + +For this example, the loop is executed `array.length`, assuming `n` is length of the array we get the following: + +---- +T(n) = n * [ t(statement 1) + t(statement 2) ] +---- + +All loops that grow proportionally to the input size have a linear time complexity `O(n)`. If you loop through only half of the array, that's still `O(n)`. Remember that we drop the constants so `1/2 n => O(n)`. + +However, if a constant number bounds the loop, let's say 4 (or even 400). Then, the runtime is constant `O(4) -> O(1)`. See the following example. + +---- +for (let i = 0; i < 4; i++) { + statement 1; + statement 2; +} +---- + +That code is `O(1)` because it no longer depends on the input size. + +*Nested loops statements* + +Sometimes you might need to visit all the elements on a 2D array (grid/table). For such cases, you might find yourself with two nested loops. + +---- +for (let i = 0; i < n; i++) { + statement 1; + + for (let j = 0; j < m; j++) { + statement 2; + statement 3; + } +} +---- + +For this case you would have something like this: + +---- +T(n) = n * [t(statement 1) + m * t(statement 2...3)] +---- + +Assuming the statements from 1 to 3 are `O(1)`, we would have a runtime of `O(n * m)`. +If instead of `m`, you had to iterate on `n` again, then it would be `O(n^2)`. Another typical case is having a function inside a loop. Let's see how to deal with that next. + +*Function call statements* + +When you calculate your programs' time complexity and invoke a function, you need to be aware of its runtime. If you created the function, that might be a simple inspection of the implementation. However, if you are using a library function, you might infer it from the language/library documentation. + +Let's say you have the following program: + +---- +for (let i = 0; i < n; i++) { + fn1(); + for (let j = 0; j < n; j++) { + fn2(); + for (let k = 0; k < n; k++) { + fn3(); + } + } +} +---- + +.Depending on the runtime of fn1, fn2, and fn3, you would have different runtimes. +- If they all are constant `O(1)`, then the final runtime would be `O(n^3)`. +- However, if only `fn1` and `fn2` are constant and `fn3` has a runtime of `O(n^2)`, this program will have a runtime of `O(n^5)`. Another way to look at it is, if `fn3` has two nested and you replace the invocation with the actual implementation, you would have five nested loops. + +In general, you will have something like this: + +---- +T(n) = n * [ t(fn1()) + n * [ t(fn2()) + n * [ t(fn3()) ] ] ] +---- + +*Recursive Functions Statements* + +Analyzing the runtime of recursive functions might get a little tricky. There are different ways to do it. One intuitive way is to explore the recursion tree. + +Let's say that we have the following program: + +---- +function fn(n) { + if (n < 0) return 0; + if (n < 2) return n; + + return fn(n - 1) + fn(n - 2); +} +---- + +You can represent each function invocation as a bubble (or node). + +.Let's do some examples: +- When you n = 2, you have 3 function calls. First `fn(2)` which in turn calls `fn(1)` and `fn(0)`. +- For `n = 3`, you have 5 function calls. First `fn(3)`, which in turn calls `fn(2)` and `fn(1)` and so on. +- For `n = 4`, you have 9 function calls. First `fn(4)`, which in turn calls `fn(3)` and `fn(2)` and so on. + +Since it's a binary tree, we can sense that every time `n` increases by one, we would have to perform at most the double of operations. + +Here's the graphical representation of the 3 examples: + +[graphviz, big-o-recursive-example, 'png'] +---- +graph G { + subgraph cluster_2 { + label = "fn(2)" + "fn(2)-" -- { "fn(1)-", "fn(0)-" } + + "fn(0)-" [label="fn(0)"]; + "fn(1)-" [label="fn(1)", color=red]; + "fn(2)-" [label="fn(2)", color=red]; + } + + subgraph cluster_1 { + label = "fn(3)" + "fn(3)1" -- { "fn(2)1", "fn(1)1" } + "fn(2)1" -- { "fn(1)3", "fn(0)1" } + + "fn(0)1" [label="fn(0)"]; + "fn(1)3" [label="fn(1)", color=red]; + "fn(1)1" [label="fn(1)"]; + "fn(2)1" [label="fn(2)", color=red]; + "fn(3)1" [label="fn(3)", color=red]; + } + + subgraph cluster_0 { + label = "fn(4)" + "fn(4)" -- { "fn(3)*", "fn(2)" } + "fn(2)" -- { "fn(1)*", "fn(0)" } + "fn(3)*" -- { "fn(2)**", "fn(1)**" } + "fn(2)**" -- { "fn(1)****", "fn(0)**" } + + "fn(0)**" [label="fn(0)"]; + "fn(1)*" [label="fn(1)"]; + "fn(1)**" [label="fn(1)"]; + "fn(1)****" [label="fn(1)", color=red]; + "fn(2)**" [label="fn(2)", color=red]; + "fn(3)*" [label="fn(3)", color=red]; + "fn(4)" [label="fn(4)", color=red]; + } +} +---- + +If you take a look at the generated tree calls, the leftmost nodes go down in descending order: `fn(4)`, `fn(3)`, `fn(2)`, `fn(1)`, which means that the height of the tree (or the number of levels) on the tree will be `n`. + +The total number of calls, in a complete binary tree, is `2^n - 1`. As you can see in `fn(4)`, the tree is not complete. The last level will only have two nodes, `fn(1)` and `fn(0)`, while a complete tree would have 8 nodes. But still, we can say the runtime would be exponential `O(2^n)`. It won't get any worst because `2^n` is the upper bound. + +==== Summary + +.In this chapter, we learned how to calculate the time complexity of our code when we have the following elements: +- Basic operations like assignments, bit, and math operators. +- Loops and nested loops +- Function invocations and recursions. + +In the next section, we are going to the most common time complexities and real code examples. diff --git a/book/images/big-o-recursive-example.png b/book/images/big-o-recursive-example.png new file mode 100644 index 0000000000000000000000000000000000000000..67395f3c94048535cd4316ac65235f793368b384 GIT binary patch literal 44967 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

    2*+dB)MSw}25LAw)U{Ftl@N-{?`CGDL2M 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 OedYKK>zc#&v3~=SUA>(E literal 0 HcmV?d00001 diff --git a/book/images/big-o-running-time-complexity.png b/book/images/big-o-running-time-complexity.png new file mode 100644 index 0000000000000000000000000000000000000000..c08878fcb995596792ae0ba5eee8f8573af1c029 GIT binary patch literal 79243 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

    q+W^Nh$OCCR5mZj~J`fG^0U!rS&Tfka?SG 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 literal 0 HcmV?d00001 diff --git a/book/images/recursive-fibonacci-call-tree.png b/book/images/recursive-fibonacci-call-tree.png index 380ffa1343f49c6ccaf76a5cb6aae788d963169b..f6e028c3cf7c9cad1748ee3072c82a4c6eec3982 100644 GIT binary patch literal 41935 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 Date: Tue, 29 Sep 2020 20:22:01 +0000 Subject: [PATCH 147/200] :bookmark: chore(release): 2.2.0 # [2.2.0](https://github.com/amejiarosario/dsa.js/compare/2.1.0...2.2.0) (2020-09-29) ### Features * **book/big-o:** add new chapter on how to determine big o from code. ([68c73d4](https://github.com/amejiarosario/dsa.js/commit/68c73d4c3bb5fb1ec637d81b42a2f8dbfc4f0008)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88082ee9..2d276386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.2.0](https://github.com/amejiarosario/dsa.js/compare/2.1.0...2.2.0) (2020-09-29) + + +### Features + +* **book/big-o:** add new chapter on how to determine big o from code. ([68c73d4](https://github.com/amejiarosario/dsa.js/commit/68c73d4c3bb5fb1ec637d81b42a2f8dbfc4f0008)) + # [2.1.0](https://github.com/amejiarosario/dsa.js/compare/2.0.0...2.1.0) (2020-09-11) diff --git a/package-lock.json b/package-lock.json index ecc2df64..9505dcc3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 786dda6c..990a4328 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.1.0", + "version": "2.2.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 1392938b9a7b354087c5108b65a31a255412eb10 Mon Sep 17 00:00:00 2001 From: dahalnischal <72251500+dahalnischal@users.noreply.github.com> Date: Fri, 2 Oct 2020 15:12:47 +0545 Subject: [PATCH 148/200] Update introduction.asc --- book/content/introduction.asc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/content/introduction.asc b/book/content/introduction.asc index cec2cb11..9a1326e8 100644 --- a/book/content/introduction.asc +++ b/book/content/introduction.asc @@ -1,13 +1,13 @@ [preface] == Introduction -You are about to become a better programmer and grasp the fundamentals of Algorithms and Data Structures. +You are about to become a better programmer and graps the fundamentals of Algorithms and Data Structures. Let's take a moment to explain how are we going to do that. This book is divided in 4 main parts.... In *Chapter 1*, we're going to cover Version Control Systems (VCSs) and Git basics -- no technical stuff, just what Git is, why it came about in a land full of VCSs, what sets it apart, and why so many people are using it. -Then, we'll explain how to download Git and set it up for the first time if you don't already have it on your system. +Then, we'll explain how to download Git and set it up for the first time if you don't have already on your system. In *Chapter 2*, we will go over basic Git usage -- how to use Git in the 80% of cases you'll encounter most often. After reading this chapter, you should be able to clone a repository, see what has happened in the history of the project, modify files, and contribute changes. From 4505eb64a63b282ca9685b3b2cabb657149d9fe7 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 2 Oct 2020 16:13:00 -0400 Subject: [PATCH 149/200] fix(book): add introduction --- book/content/introduction.asc | 58 ++++++----------------------------- book/readme.asc | 2 +- 2 files changed, 11 insertions(+), 49 deletions(-) diff --git a/book/content/introduction.asc b/book/content/introduction.asc index 9a1326e8..e59de6d1 100644 --- a/book/content/introduction.asc +++ b/book/content/introduction.asc @@ -1,59 +1,21 @@ [preface] == Introduction -You are about to become a better programmer and graps the fundamentals of Algorithms and Data Structures. -Let's take a moment to explain how are we going to do that. +You are about to become a better programmer and grasp the fundamentals of Algorithms and Data Structures. +Let's take a moment to explain how we are going to do that. -This book is divided in 4 main parts.... +This book is divided into 4 main parts: -In *Chapter 1*, we're going to cover Version Control Systems (VCSs) and Git basics -- no technical stuff, just what Git is, why it came about in a land full of VCSs, what sets it apart, and why so many people are using it. -Then, we'll explain how to download Git and set it up for the first time if you don't have already on your system. +In *Part 1*, we will cover the framework to compare and analyze algorithms: Big O notation. When you have multiple solutions to a problem, this framework comes handy to know which solution will scale better. -In *Chapter 2*, we will go over basic Git usage -- how to use Git in the 80% of cases you'll encounter most often. -After reading this chapter, you should be able to clone a repository, see what has happened in the history of the project, modify files, and contribute changes. -If the book spontaneously combusts at this point, you should already be pretty useful wielding Git in the time it takes you to go pick up another copy. +In *Part 2*, we will go over linear data structures and trade-offs about using one over another. +After reading this part, you will know how to trade space for speed using Maps, when to use a linked list over an array, or what problems can be solved using a stack over a queue. -*Chapter 3* is about the branching model in Git, often described as Git's killer feature. -Here you'll learn what truly sets Git apart from the pack. -When you're done, you may feel the need to spend a quiet moment pondering how you lived before Git branching was part of your life. +*Part 3* is about graphs and trees and its algorithms. +Here you'll learn how to translate real-world problems into graphs and different algorithms to solve them. -*Chapter 4* will cover Git on the server. -This chapter is for those of you who want to set up Git inside your organization or on your own personal server for collaboration. -We will also explore various hosted options if you prefer to let someone else handle that for you. +*Part 4* will cover tools and techniques to solve algorithmic problems. This section is for those who want to get better at recognizing patterns and improving problem-solving skills. We cover sorting algorithms and standard practices like dynamic programming, greedy algorithms, divide and conquer, and more. -*Chapter 5* will go over in full detail various distributed workflows and how to accomplish them with Git. -When you are done with this chapter, you should be able to work expertly with multiple remote repositories, use Git over email and deftly juggle numerous remote branches and contributed patches. - -*Chapter 6* covers the GitHub hosting service and tooling in depth. -We cover signing up for and managing an account, creating and using Git repositories, common workflows to contribute to projects and to accept contributions to yours, GitHub's programmatic interface and lots of little tips to make your life easier in general. - -*Chapter 7* is about advanced Git commands. -Here you will learn about topics like mastering the scary 'reset' command, using binary search to identify bugs, editing history, revision selection in detail, and a lot more. -This chapter will round out your knowledge of Git so that you are truly a master. - -*Chapter 8* is about configuring your custom Git environment. -This includes setting up hook scripts to enforce or encourage customized policies and using environment configuration settings so you can work the way you want to. -We will also cover building your own set of scripts to enforce a custom committing policy. - -*Chapter 9* deals with Git and other VCSs. -This includes using Git in a Subversion (SVN) world and converting projects from other VCSs to Git. -A lot of organizations still use SVN and are not about to change, but by this point you'll have learned the incredible power of Git -- and this chapter shows you how to cope if you still have to use a SVN server. -We also cover how to import projects from several different systems in case you do convince everyone to make the plunge. - -*Chapter 10* delves into the murky yet beautiful depths of Git internals. -Now that you know all about Git and can wield it with power and grace, you can move on to discuss how Git stores its objects, -what the object model is, details of packfiles, server protocols, and more. -Throughout the book, we will refer to sections of this chapter in case you feel like diving deep at that point; but if you are like us and want to dive into the technical details, you may want to read Chapter 10 first. -We leave that up to you. - -In *Appendix A*, we look at a number of examples of using Git in various specific environments. -We cover a number of different GUIs and IDE programming environments that you may want to use Git in and what is available for you. -If you're interested in an overview of using Git in your shell, your IDE, or your text editor, take a look here. - -In *Appendix B*, we explore scripting and extending Git through tools like libgit2 and JGit. -If you're interested in writing complex and fast custom tools and need low-level Git access, this is where you can see what that landscape looks like. - -Finally, in *Appendix C*, we go through all the major Git commands one at a time and review where in the book we covered them and what we did with them. -If you want to know where in the book we used any specific Git command you can look that up here. +Finally, in *Appendix A*, we summarize all the topics covered in this book in a cheatsheet. *Appendix B and C* covers self-balancing binary search tree algorithms. *Appendix D* cover the solutions to the problems presented at the end of each chapter. Let's get started. diff --git a/book/readme.asc b/book/readme.asc index 48f92fbe..89c67ba3 100644 --- a/book/readme.asc +++ b/book/readme.asc @@ -44,7 +44,7 @@ include::content/dedication.asc[] include::content/preface.asc[] -// include::content/introduction.asc[] +include::content/introduction.asc[] include::part01-algorithms-analysis.asc[] From b047c23ae6ea76cf44c0fa5db01e54e9ed2f7a99 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 2 Oct 2020 20:17:27 +0000 Subject: [PATCH 150/200] :bookmark: chore(release): 2.2.1 ## [2.2.1](https://github.com/amejiarosario/dsa.js/compare/2.2.0...2.2.1) (2020-10-02) ### Bug Fixes * **book:** add introduction ([4505eb6](https://github.com/amejiarosario/dsa.js/commit/4505eb64a63b282ca9685b3b2cabb657149d9fe7)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d276386..c7be071e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [2.2.1](https://github.com/amejiarosario/dsa.js/compare/2.2.0...2.2.1) (2020-10-02) + + +### Bug Fixes + +* **book:** add introduction ([4505eb6](https://github.com/amejiarosario/dsa.js/commit/4505eb64a63b282ca9685b3b2cabb657149d9fe7)) + # [2.2.0](https://github.com/amejiarosario/dsa.js/compare/2.1.0...2.2.0) (2020-09-29) diff --git a/package-lock.json b/package-lock.json index 9505dcc3..eb408cf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.2.0", + "version": "2.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 990a4328..caf7c267 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.2.0", + "version": "2.2.1", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 249de5d4769549e9f05562bb6dad50d4e0384524 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 3 Oct 2020 18:15:10 -0400 Subject: [PATCH 151/200] feat(treeMap): get last entry (highest value) --- .../maps/tree-maps/tree-map.js | 21 +++++++++ .../maps/tree-maps/tree-map.spec.js | 43 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/data-structures/maps/tree-maps/tree-map.spec.js diff --git a/src/data-structures/maps/tree-maps/tree-map.js b/src/data-structures/maps/tree-maps/tree-map.js index eed8bc78..10957aed 100644 --- a/src/data-structures/maps/tree-maps/tree-map.js +++ b/src/data-structures/maps/tree-maps/tree-map.js @@ -18,6 +18,11 @@ const Tree = require('../../trees/red-black-tree'); // fast insertion * allocate memory beforehand (e.g. HashMap’s initial capacity) * nor you have to rehash when is getting full. * + * Implementations in other languages: + * Java: https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/TreeMap.html + * C++: https://en.cppreference.com/w/cpp/container/map + * Python: none + * */ class TreeMap { // tag::constructor[] @@ -92,6 +97,22 @@ class TreeMap { } // end::delete[] + /** + * Get the last key/value pair (node with largest key) + */ + lastEntry() { + const node = this.tree.getRightmost(); + return node ? [node.value, node.data()] : []; + } + + /** + * Get the first key/value pair (node with smallest key) + */ + firstEntry() { + const node = this.tree.getLeftmost(); + return node ? [node.value, node.data()] : []; + } + // tag::iterators[] /** * Default iterator for this map diff --git a/src/data-structures/maps/tree-maps/tree-map.spec.js b/src/data-structures/maps/tree-maps/tree-map.spec.js new file mode 100644 index 00000000..8661207a --- /dev/null +++ b/src/data-structures/maps/tree-maps/tree-map.spec.js @@ -0,0 +1,43 @@ +// some parts tested on src/data-structures/maps/map.spec.js + +const TreeMap = require('./tree-map'); + +describe('TreeMap: keep values sorted', () => { + let map; + + beforeEach(() => { + map = new TreeMap(); + }); + + describe('when map is empty', () => { + describe('.lastEntry and .firstEntry', () => { + it('should get last/first entry', () => { + expect(map.lastEntry()).toEqual([]); + expect(map.firstEntry()).toEqual([]); + }); + }); + }); + + describe('when map has entries', () => { + beforeEach(() => { + map.set(20, { title: '3sum', passed: true }); + map.set(30, { title: '3sum', passed: false }); + map.set(10, { title: '2sum', passed: true }); + map.set(5, { title: '4sum', passed: false }); + }); + + describe('.lastEntry and .firstEntry', () => { + it('should get last/first entry', () => { + expect(map.lastEntry()).toEqual([ + 30, + { title: '3sum', passed: false }, + ]); + + expect(map.firstEntry()).toEqual([ + 5, + { title: '4sum', passed: false }, + ]); + }); + }); + }); +}); From 1b2d61211fa31175ef973e6c45fa0163b627c36c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 3 Oct 2020 23:55:46 +0000 Subject: [PATCH 152/200] :bookmark: chore(release): 2.3.0 # [2.3.0](https://github.com/amejiarosario/dsa.js/compare/2.2.1...2.3.0) (2020-10-03) ### Features * **treeMap:** get last entry (highest value) ([249de5d](https://github.com/amejiarosario/dsa.js/commit/249de5d4769549e9f05562bb6dad50d4e0384524)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7be071e..c98336a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.3.0](https://github.com/amejiarosario/dsa.js/compare/2.2.1...2.3.0) (2020-10-03) + + +### Features + +* **treeMap:** get last entry (highest value) ([249de5d](https://github.com/amejiarosario/dsa.js/commit/249de5d4769549e9f05562bb6dad50d4e0384524)) + ## [2.2.1](https://github.com/amejiarosario/dsa.js/compare/2.2.0...2.2.1) (2020-10-02) diff --git a/package-lock.json b/package-lock.json index eb408cf2..7ea7ed10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.2.1", + "version": "2.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index caf7c267..9cf19af3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "2.2.1", + "version": "2.3.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js", From 1287f293c6b86a7ae225c8170801e3420ce13fd6 Mon Sep 17 00:00:00 2001 From: PokhrelAnish <72329285+PokhrelAnish@users.noreply.github.com> Date: Sun, 4 Oct 2020 11:02:17 +0545 Subject: [PATCH 153/200] Update CONTRIBUTING.md --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f0989d2..605887c4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,14 @@ # Contributing -We encourage any form of contribution, whether that be issues, comments, or pull requests. If you are going to be submitting a PR, there are a few things we would appreciate that you do to keep the codebase clean: +We encourage any form of contribution, whether that will be issues, comments, or pull requests. If you are willing to submit a PR, there are a few things we would appreciate that you do to keep the codebase clean: * **Write tests.** We try as close to 100% code coverage as possible on this repo so any new code that gets written should have accompanying tests. * **Follow the linter.** We use our [ESLint configuration with Airbnb JavaScript Styleguide](https://github.com/airbnb/javascript), and we run `npm run lint` in our Travis builds. * **Ask questions if you aren't sure.** If you have any questions while implementing a fix or feature, feel free to create an issue and ask us. We're happy to help! -## Submission Guidelines +## Submission Guidelines -### Submitting an Issue +### Submitting an Issue Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available. @@ -188,7 +188,7 @@ Examples of breaking changes include: We use these three sections in changelog: new features, bug fixes, breaking changes. -List of all subjects (first lines in commit message) since last release: +List of all subjects (First lines in commit message) since last release: ```sh git log HEAD --pretty=format:%s From 9175b628caec24d07b683463a836430add88cddf Mon Sep 17 00:00:00 2001 From: PokhrelAnish <72329285+PokhrelAnish@users.noreply.github.com> Date: Sun, 4 Oct 2020 11:03:30 +0545 Subject: [PATCH 154/200] Update CONTRIBUTING.md this might help you and yours every viewer. From f5169b540e62245f73c710d7643d61553c724cfb Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 4 Oct 2020 15:48:57 -0400 Subject: [PATCH 155/200] chore: add examples to contributing --- CONTRIBUTING.md | 36 +++++++----------------------------- notes.md | 2 +- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 605887c4..1a0c18a6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -121,14 +121,17 @@ to read on GitHub as well as in various git tools. The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any. + +Examples: + ``` -docs(changelog): update changelog to beta.5 -``` +feat(heap): add error handling for heaps +BREAKING CHANGE: size is now an attribute rather than a method. Similar to the built-in Map.size and Set.size ``` -fix(release): need to depend on latest rxjs and zone.js -The version in our package.json gets copied to the one we publish, and users need the latest of these. +``` +fix(book/solutions): fix missing solutions ``` ### Revert @@ -184,31 +187,6 @@ Examples of breaking changes include: * changing the side effects of using a particular API -## Generating Changelog - -We use these three sections in changelog: new features, bug fixes, breaking changes. - -List of all subjects (First lines in commit message) since last release: - -```sh -git log HEAD --pretty=format:%s - -# example -git log 1.1.0..HEAD --pretty=format:%s -``` - -New features in this release - -```sh -git log HEAD --grep feat - -# examples -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "BREAKING CHANGE:" -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^feat\S*:" -git log 1.2.0..HEAD --pretty=format:"- %s [commit](https://github.com/amejiarosario/dsa.js/commit/%H)" --grep "^fix\S*:" -``` - - diff --git a/notes.md b/notes.md index c868f237..1321acf3 100644 --- a/notes.md +++ b/notes.md @@ -10,7 +10,7 @@ and the meaning the the following: - Minor: Features (new functionality, adding new topics) - Patch: Fixes (bug fixes, typos, etc.) -# Generating Changelog +# Generating Changelog (manually) [deprecated] We use these three sections in changelog: new features, bug fixes, breaking changes. From 8135449234ab52c0a586b4c854c07a77d1367ec0 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sun, 4 Oct 2020 15:56:48 -0400 Subject: [PATCH 156/200] chore: improves docs grammar --- CONTRIBUTING.md | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1a0c18a6..43e79136 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ We encourage any form of contribution, whether that will be issues, comments, or pull requests. If you are willing to submit a PR, there are a few things we would appreciate that you do to keep the codebase clean: -* **Write tests.** We try as close to 100% code coverage as possible on this repo so any new code that gets written should have accompanying tests. +* **Write tests (if applicable).** We try as close to 100% code coverage as possible on this repo, so any new code that gets written should have accompanying tests. * **Follow the linter.** We use our [ESLint configuration with Airbnb JavaScript Styleguide](https://github.com/airbnb/javascript), and we run `npm run lint` in our Travis builds. * **Ask questions if you aren't sure.** If you have any questions while implementing a fix or feature, feel free to create an issue and ask us. We're happy to help! @@ -10,15 +10,15 @@ We encourage any form of contribution, whether that will be issues, comments, or ### Submitting an Issue -Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available. +Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists, and the discussion might inform you of workarounds readily available. ### Submitting a Pull Request (PR) -Before you submit your Pull Request (PR) consider the following guidelines: +Before you submit your Pull Request (PR), consider the following guidelines: 1. Search [GitHub](https://github.com/amejiarosario/dsa.js/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate effort. -1. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add. - Discussing the design up front helps to ensure that we're ready to accept your work. +1. Be sure that an issue describes the problem you're fixing or documents the design for the feature you'd like to add. + Discussing the design upfront helps to ensure that we're ready to accept your work. 1. Fork the `amejiarosario/dsa.js` repo. 1. Make your changes in a new git branch: @@ -29,14 +29,13 @@ Before you submit your Pull Request (PR) consider the following guidelines: 1. Create your patch, **including appropriate test cases**. 1. Run the full test suite, and ensure that all tests pass. 1. Commit your changes using a descriptive commit message that follows our - [commit message conventions](#commit). Adherence to these conventions - is necessary because release notes are automatically generated from these messages. + [commit message conventions](#commit). Adherence to these conventions is necessary because release notes are automatically generated from these messages. ```shell git commit -a ``` - Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. + Note: the optional commit `-a` command-line option will automatically "add" and "rm" edited files. 1. Push your branch to GitHub: @@ -88,8 +87,8 @@ from the main (upstream) repository: ## Commit Message Guidelines -We have some guidelines how our git commit messages can be formatted. This leads to **more -readable messages** that are easy to follow when looking through the **project history**. But also, +We have some guidelines on how our git commit messages can be formatted. These rules lead to more +readable messages that are easy to follow when looking through the project history. But also, we use the git commit messages to **generate the change log**. ### Commit Message Format @@ -104,22 +103,21 @@ format that includes a **type**, a **scope** and a **subject**:

    CyP=6^LS{pG)0`eOCw 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 literal 0 HcmV?d00001 diff --git a/book/images/intervals-overlap-cases.svg b/book/images/intervals-overlap-cases.svg new file mode 100644 index 00000000..b0f003d8 --- /dev/null +++ b/book/images/intervals-overlap-cases.svg @@ -0,0 +1 @@ +
    a
    a
    b
    b
    a
    a
    b
    b
    a
    a
    b
    b
    => 'a' and 'b' do not overlap
    =&gt; 'a' and 'b' do not overlap
    => 'a' & 'b' overlap, 'b' ends after 'a'
    =&gt; 'a' &amp; 'b' overlap, 'b' ends after 'a'
    => 'a' completely overlaps 'b'
    =&gt; 'a' completely overlaps 'b'
    1)
    1)
    2)
    2)
    3)
    3)
    time
    time
    a
    a
    b
    b
    => 'a' & 'b' overlap, 'a' ends after 'b'
    =&gt; 'a' &amp; 'b' overlap, 'a' ends after 'b'
    4)
    4)
    b
    b
    => 'b' completely overlaps 'a'
    =&gt; 'b' completely overlaps 'a'
    5)
    5)
    a
    a
    b
    b
    => 'a' and 'b' do not overlap
    =&gt; 'a' and 'b' do not overlap
    6)
    6)
    a
    a
    \ No newline at end of file diff --git a/book/images/merge-intervals-cases.png b/book/images/merge-intervals-cases.png new file mode 100644 index 0000000000000000000000000000000000000000..574438a9f7a35709b47ef8424a533075f2ba1e3a GIT binary patch literal 28966 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 literal 0 HcmV?d00001 diff --git a/book/interview-questions/merge-intervals.js b/book/interview-questions/merge-intervals.js new file mode 100644 index 00000000..10192cbb --- /dev/null +++ b/book/interview-questions/merge-intervals.js @@ -0,0 +1,32 @@ +// const { } = require('../../src/index'); + +// tag::description[] +/** + * Merge overlapping intervals. + * @param {[numer, number][]} intervals - Array with pairs [start, end] + * @returns {[numer, number][]} - Array of merged pairs [start, end] + */ +function merge(intervals) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const ans = []; + + intervals.sort((a, b) => a[0] - b[0]); // sort by start time + + for (let i = 0; i < intervals.length; i++) { + const last = ans[ans.length - 1]; + const curr = intervals[i]; + if (last && last[1] >= curr[0]) { // check for overlaps + last[1] = Math.max(last[1], curr[1]); + } else ans.push(curr); + } + return ans; + // end::solution[] + // tag::description[] +} +// end::description[] + +module.exports = { merge }; diff --git a/book/interview-questions/merge-intervals.spec.js b/book/interview-questions/merge-intervals.spec.js new file mode 100644 index 00000000..da875e4d --- /dev/null +++ b/book/interview-questions/merge-intervals.spec.js @@ -0,0 +1,30 @@ +const { merge } = require('./merge-intervals'); +// const { } = require('../../src/index'); + +[merge].forEach((fn) => { + describe(`TOPIC: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = fn([]); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = fn([[1, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn([[0, 1], [1, 3], [3, 5], [6, 6]]); + const expected = [[0, 5], [6, 6]]; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn([[10, 99], [20, 50], [9, 11], [98, 100]]); + const expected = [[9, 100]]; + expect(actual).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/sort-colors.js b/book/interview-questions/sort-colors.js new file mode 100644 index 00000000..daee44cb --- /dev/null +++ b/book/interview-questions/sort-colors.js @@ -0,0 +1,49 @@ +// const { } = require('../../src/index'); + +// tag::description[] +/** + * Sort array of 0's, 1's and 2's in linear time and in-place. + * @param {numbers[]} nums - Array of number (0, 1, or 2). + * @returns {void} Don't return anything, modify the input array. + */ +function sortColors(nums) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + let left = 0; + let right = nums.length - 1; + let curr = 0; + + while (curr <= right) { + if (nums[curr] < 1) { + [nums[curr], nums[left]] = [nums[left], nums[curr]]; // swap + left++; + curr++; + } else if (nums[curr] > 1) { + [nums[curr], nums[right]] = [nums[right], nums[curr]]; // swap + right--; + } else { + curr++; + } + } + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::compact[] +function sortColorsCompact(nums) { + let i = 0, lo = 0, hi = nums.length - 1; + const swap = (k, j) => [nums[k], nums[j]] = [nums[j], nums[k]]; + + while (i <= hi) { + if (nums[i] < 1) swap(i++, lo++); + else if (nums[i] > 1) swap(i, hi--); + else i++; + } +} +// end::compact[] + +module.exports = { sortColors, sortColorsCompact }; diff --git a/book/interview-questions/sort-colors.spec.js b/book/interview-questions/sort-colors.spec.js new file mode 100644 index 00000000..da394c2a --- /dev/null +++ b/book/interview-questions/sort-colors.spec.js @@ -0,0 +1,55 @@ +const { sortColors, sortColorsCompact } = require('./sort-colors'); +// const { } = require('../../src/index'); + +[sortColors, sortColorsCompact].forEach((fn) => { + describe(`Sorting: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = []; + fn(actual); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [0, 2, 1]; + fn(actual); + const expected = [0, 1, 2]; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [2, 1, 2]; + fn(actual); + const expected = [1, 2, 2]; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [1, 0, 2]; + fn(actual); + const expected = [0, 1, 2]; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = [2, 0, 1]; + fn(actual); + const expected = [0, 1, 2]; + expect(actual).toEqual(expected); + }); + + it('all numbers the same', () => { + const actual = Array(3).fill(1); + fn(actual); + const expected = [1, 1, 1]; + expect(actual).toEqual(expected); + }); + + it('larger cases', () => { + const actual = [2, 0, 2, 1, 0, 1, 0]; + fn(actual); + const expected = [0, 0, 0, 1, 1, 2, 2]; + expect(actual).toEqual(expected); + }); + }); +}); From cba73a10f86e70682fc5866f617932acbf7f304e Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Fri, 11 Sep 2020 16:17:59 -0400 Subject: [PATCH 141/200] update kindlegen --- book/config | 2 +- book/images/Find-the-largest-sum.png | Bin 16292 -> 17918 bytes .../Recursive-Fibonacci-call-tree-with-dp.png | Bin 17827 -> 20798 bytes book/images/Words-Permutations.png | Bin 47291 -> 45376 bytes book/images/recursive-fibonacci-call-tree.png | Bin 52743 -> 49993 bytes 5 files changed, 1 insertion(+), 1 deletion(-) diff --git a/book/config b/book/config index 2134d494..c95ecf80 160000 --- a/book/config +++ b/book/config @@ -1 +1 @@ -Subproject commit 2134d494d3c1834f04871f315983a3c5ee571e82 +Subproject commit c95ecf80705c3c41e570c095574fa4c4affee732 diff --git a/book/images/Find-the-largest-sum.png b/book/images/Find-the-largest-sum.png index aaf93568dae70b0b3bf0e5c90ddc6f896a0e153d..a2e2719089c4b0aa36390fbf219ece7cf89b7a46 100644 GIT binary patch literal 17918 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 LD!eHbH}v~o`?myP diff --git a/book/images/Recursive-Fibonacci-call-tree-with-dp.png b/book/images/Recursive-Fibonacci-call-tree-with-dp.png index 06beb2e6f87af7fdfd16e8f7637db0b6b22710ee..82901be256408dfe3580ecb4751bddf2fcbd46de 100644 GIT binary patch literal 20798 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 literal 17827 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%0Dk^=cSkuQ^(wJ`1 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

  • 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 fqKw$;`Q)^NFi*L0;g;H9 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 CDZHfs literal 104354 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