├── .eslintrc.js ├── .gitignore ├── .npmignore ├── .travis.yml ├── README.md ├── package.json ├── src ├── detectors │ ├── acf2plus.ts │ ├── amdf.ts │ ├── dynamic_wavelet.ts │ ├── fast_yin.ts │ ├── goertzel.ts │ ├── macleod.ts │ ├── types.ts │ └── yin.ts ├── index.ts └── tools │ └── frequencies.ts ├── test ├── index.ts ├── melodies │ └── c_major_scale_electric_piano_120.wav ├── mocha.opts └── pitches │ ├── 262_sine.wav │ ├── 440_square.wav │ ├── 587_saw.wav │ └── 988_triangle.wav ├── tsconfig.json └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'peterkhayes', 3 | rules: { 4 | '@typescript-eslint/array-type': ['error', { default: 'generic' }], 5 | }, 6 | overrides: [ 7 | { 8 | files: ["test/**/*.ts"], 9 | env: { 10 | node: true, 11 | mocha: true, 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | npm-debug.log 4 | yarn-error.log 5 | .vscode/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .eslintrc 2 | .babelrc 3 | .travis.yml 4 | src 5 | test 6 | npm-debug.log 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - node 4 | script: npm run ci-test 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/peterkhayes/pitchfinder.svg?branch=master)](https://travis-ci.org/peterkhayes/pitchfinder) 2 | 3 | # pitchfinder 4 | 5 | A compilation of pitch detection algorithms for Javascript. Supports both the browser and node. 6 | 7 | ## Provided pitch-finding algorithms 8 | 9 | - **YIN** - The best balance of accuracy and speed, in my experience. Occasionally provides values that are wildly incorrect. 10 | - **AMDF** - Slow and only accurate to around +/- 2%, but finds a frequency more consistenly than others. 11 | - **Dynamic Wavelet** - Very fast, but struggles to identify lower frequencies. 12 | - **YIN w/ FFT** _(coming soon)_ 13 | - **Goertzel** _(coming soon)_ 14 | - **Mcleod** _(coming soon)_ 15 | 16 | ## Installation 17 | 18 | `npm install --save pitchfinder` 19 | 20 | ## Usage 21 | 22 | ### Finding the pitch of a wav file in node 23 | 24 | All pitchfinding algorithms provided operate on `Float32Array`s. To find the pitch of a `wav` file, we can use the `wav-decoder` library to extract the data into such an array. 25 | 26 | ```javascript 27 | const fs = require("fs"); 28 | const WavDecoder = require("wav-decoder"); 29 | const Pitchfinder = require("pitchfinder"); 30 | 31 | // see below for optional configuration parameters. 32 | const detectPitch = Pitchfinder.YIN(); 33 | 34 | const buffer = fs.readFileSync(PATH_TO_FILE); 35 | const decoded = WavDecoder.decode.sync(buffer); // get audio data from file using `wav-decoder` 36 | const float32Array = decoded.channelData[0]; // get a single channel of sound 37 | const pitch = detectPitch(float32Array); // null if pitch cannot be identified 38 | ``` 39 | 40 | ### Finding the pitch of a WebAudio AudioBuffer in the browser 41 | 42 | This assumes you are using an npm-compatible build system, like Webpack or Browserify, and that your target browser supports WebAudio. Ample documentation on WebAudio is available online, especially on Mozilla's MDN. 43 | 44 | ```javascript 45 | import * as Pitchfinder from "pitchfinder"; 46 | 47 | const myAudioBuffer = getAudioBuffer(); // assume this returns a WebAudio AudioBuffer object 48 | const float32Array = myAudioBuffer.getChannelData(0); // get a single channel of sound 49 | 50 | const detectPitch = Pitchfinder.AMDF(); 51 | const pitch = detectPitch(float32Array); // null if pitch cannot be identified 52 | ``` 53 | 54 | ### Finding a series of pitches 55 | 56 | Set a tempo and a quantization interval, and an array of pitches at each interval will be returned. 57 | 58 | ```javascript 59 | const Pitchfinder = require("pitchfinder"); 60 | const detectPitch = Pitchfinder.YIN(); 61 | 62 | const frequencies = Pitchfinder.frequencies(detectPitch, float32Array, { 63 | tempo: 130, // in BPM, defaults to 120 64 | quantization: 4, // samples per beat, defaults to 4 (i.e. 16th notes) 65 | }); 66 | 67 | // or use multiple detectors for better accuracy at the cost of speed. 68 | const detectors = [detectPitch, Pitchfinder.AMDF()]; 69 | const moreAccurateFrequencies = Pitchfinder.frequencies( 70 | detectors, 71 | float32Array, 72 | { 73 | tempo: 130, // in BPM, defaults to 120 74 | quantization: 4, // samples per beat, defaults to 4 (i.e. 16th notes) 75 | } 76 | ); 77 | ``` 78 | 79 | ## Configuration 80 | 81 | ### All detectors 82 | 83 | - `sampleRate` - defaults to 44100 84 | 85 | ### YIN 86 | 87 | - `threshold` - used by the algorithm 88 | - `probabilityThreshold` - don't return a pitch if probability estimate is below this number. 89 | 90 | ### AMDF 91 | 92 | - `minFrequency` - Lowest frequency detectable 93 | - `maxFrequency` - Highest frequency detectable 94 | - `sensitivity` 95 | - `ratio` 96 | 97 | ### Dynamic Wavelet 98 | 99 | _no special config_ 100 | 101 | ## Note 102 | 103 | If you'd like a version that uses compiled C++ code and runs much faster, check out [this repo](https://github.com/cristovao-trevisan/node-pitchfinder). However, it will not work in the browser. 104 | 105 | ## Todo 106 | 107 | - Integrate with `teoria` or another music theory tool to add more intelligent parsing. 108 | - Note-onset algorithms. 109 | - Enable requiring of single detectors. 110 | 111 | ## Thanks 112 | 113 | Several of these algorithms were ported from Jonas Six's excellent TarsosDSP library (written in Java). If you're looking for a far deeper set of tools than this, check out his work [on his website](https://0110.be/tags/TarsosDSP) or [on Github](https://github.com/JorenSix/TarsosDSP). 114 | 115 | Thanks to Aubio for his [YIN code](https://github.com/aubio/aubio/blob/master/src/pitch/pitchyin.c) 116 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pitchfinder", 3 | "version": "2.3.2", 4 | "description": "A pitch-detection library for node and the browser", 5 | "main": "lib/index.js", 6 | "types": "lib/index.d.ts", 7 | "scripts": { 8 | "build": "tsc", 9 | "lint": "eslint ./src/**/*.ts", 10 | "test": "mocha", 11 | "ci-test": "yarn && yarn lint && yarn test", 12 | "prepublish": "yarn lint && yarn test && yarn build" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/peterkhayes/pitchfinder.git" 17 | }, 18 | "keywords": [ 19 | "pitch", 20 | "frequency", 21 | "detector", 22 | "detect", 23 | "detection", 24 | "find", 25 | "YIN", 26 | "AMDF", 27 | "autocorrelation", 28 | "music", 29 | "audio" 30 | ], 31 | "author": "Peter Hayes", 32 | "license": "GNU v3", 33 | "bugs": { 34 | "url": "https://github.com/peterkhayes/pitchfinder/issues" 35 | }, 36 | "homepage": "https://github.com/peterkhayes/pitchfinder#readme", 37 | "devDependencies": { 38 | "@types/mocha": "^7.0.2", 39 | "@types/mz": "^2.7.0", 40 | "@types/node": "^13.13.4", 41 | "eslint": "^6.8.0", 42 | "eslint-config-peterkhayes": "^2.2.0", 43 | "eslint-plugin-prettier": "^3.1.3", 44 | "expect": "^26.0.1", 45 | "mocha": "^7.1.2", 46 | "mz": "^2.4.0", 47 | "prettier": "^2.0.5", 48 | "ts-node": "^8.10.1", 49 | "typescript": "^3.8.3", 50 | "wav": "^1.0.0", 51 | "wav-decoder": "^1.1.0" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/detectors/acf2plus.ts: -------------------------------------------------------------------------------- 1 | import { PitchDetector } from './types'; 2 | 3 | export interface ACF2Config { 4 | sampleRate: number; 5 | } 6 | 7 | const DEFAULT_PARAMS: ACF2Config = { 8 | sampleRate: 44100, 9 | }; 10 | 11 | export function ACF2PLUS(params: Partial = DEFAULT_PARAMS): PitchDetector { 12 | const config = { 13 | ...DEFAULT_PARAMS, 14 | ...params, 15 | }; 16 | const { sampleRate } = config; 17 | 18 | // Implements the ACF2+ algorithm 19 | return function ACF2PLUSDetector(float32AudioBuffer: Float32Array): number { 20 | const maxShift = float32AudioBuffer.length; 21 | 22 | let rms = 0; 23 | let i, j, u, tmp; 24 | 25 | for (i = 0; i < maxShift; i++) { 26 | tmp = float32AudioBuffer[i]; 27 | rms += tmp * tmp; 28 | } 29 | 30 | rms = Math.sqrt(rms / maxShift); 31 | 32 | if (rms < 0.01) 33 | // not enough signal 34 | return -1; 35 | 36 | /* Trimming cuts the edges of the signal so that it starts and ends near zero. 37 | This is used to neutralize an inherent instability of the ACF version I use.*/ 38 | let aux1 = 0; 39 | let aux2 = maxShift - 1; 40 | const thres = 0.2; 41 | for (i = 0; i < maxShift / 2; i++) 42 | if (Math.abs(float32AudioBuffer[i]) < thres) { 43 | aux1 = i; 44 | break; 45 | } 46 | for (i = 1; i < maxShift / 2; i++) 47 | if (Math.abs(float32AudioBuffer[maxShift - i]) < thres) { 48 | aux2 = maxShift - i; 49 | break; 50 | } 51 | 52 | const frames = float32AudioBuffer.slice(aux1, aux2); 53 | const framesLength = frames.length; 54 | 55 | const calcSub = new Array(framesLength).fill(0); 56 | for (i = 0; i < framesLength; i++) 57 | for (j = 0; j < framesLength - i; j++) 58 | calcSub[i] = calcSub[i] + frames[j] * frames[j + i]; 59 | 60 | u = 0; 61 | while (calcSub[u] > calcSub[u + 1]) u++; 62 | let maxval = -1, 63 | maxpos = -1; 64 | for (i = u; i < framesLength; i++) { 65 | if (calcSub[i] > maxval) { 66 | maxval = calcSub[i]; 67 | maxpos = i; 68 | } 69 | } 70 | 71 | let T0 = maxpos; 72 | 73 | /* Interpolation is parabolic interpolation. It helps with precision. 74 | We suppose that a parabola pass through the three points that comprise the peak. 75 | 'a' and 'b' are the unknowns from the linear equation system 76 | and b/(2a) is the "error" in the abscissa. 77 | y1,y2,y3 are the ordinates.*/ 78 | 79 | const y1 = calcSub[T0 - 1], 80 | y2 = calcSub[T0], 81 | y3 = calcSub[T0 + 1]; 82 | const a = (y1 + y3 - 2 * y2) / 2; 83 | const b = (y3 - y1) / 2; 84 | if (a) T0 = T0 - b / (2 * a); 85 | 86 | return sampleRate / T0; 87 | }; 88 | } 89 | -------------------------------------------------------------------------------- /src/detectors/amdf.ts: -------------------------------------------------------------------------------- 1 | import { PitchDetector } from './types'; 2 | 3 | export interface AMDFConfig { 4 | sampleRate: number; 5 | minFrequency: number; 6 | maxFrequency: number; 7 | sensitivity: number; 8 | ratio: number; 9 | } 10 | 11 | const DEFAULT_AMDF_PARAMS: AMDFConfig = { 12 | sampleRate: 44100, 13 | minFrequency: 82, 14 | maxFrequency: 1000, 15 | ratio: 5, 16 | sensitivity: 0.1, 17 | }; 18 | 19 | export function AMDF(params: Partial = {}): PitchDetector { 20 | const config: AMDFConfig = { 21 | ...DEFAULT_AMDF_PARAMS, 22 | ...params, 23 | }; 24 | const sampleRate = config.sampleRate; 25 | const minFrequency = config.minFrequency; 26 | const maxFrequency = config.maxFrequency; 27 | const sensitivity = config.sensitivity; 28 | const ratio = config.ratio; 29 | const amd: Array = []; 30 | 31 | /* Round in such a way that both exact minPeriod as 32 | exact maxPeriod lie inside the rounded span minPeriod-maxPeriod, 33 | thus ensuring that minFrequency and maxFrequency can be found 34 | even in edge cases */ 35 | const maxPeriod = Math.ceil(sampleRate / minFrequency); 36 | const minPeriod = Math.floor(sampleRate / maxFrequency); 37 | 38 | return function AMDFDetector(float32AudioBuffer: Float32Array): number | null { 39 | const maxShift = float32AudioBuffer.length; 40 | 41 | let t = 0; 42 | let minval = Infinity; 43 | let maxval = -Infinity; 44 | let frames1, frames2, calcSub, i, j, u, aux1, aux2; 45 | 46 | // Find the average magnitude difference for each possible period offset. 47 | for (i = 0; i < maxShift; i++) { 48 | if (minPeriod <= i && i <= maxPeriod) { 49 | for ( 50 | aux1 = 0, aux2 = i, t = 0, frames1 = [], frames2 = []; 51 | aux1 < maxShift - i; 52 | t++, aux2++, aux1++ 53 | ) { 54 | frames1[t] = float32AudioBuffer[aux1]; 55 | frames2[t] = float32AudioBuffer[aux2]; 56 | } 57 | 58 | // Take the difference between these frames. 59 | const frameLength = frames1.length; 60 | calcSub = []; 61 | for (u = 0; u < frameLength; u++) { 62 | calcSub[u] = frames1[u] - frames2[u]; 63 | } 64 | 65 | // Sum the differences. 66 | let summation = 0; 67 | for (u = 0; u < frameLength; u++) { 68 | summation += Math.abs(calcSub[u]); 69 | } 70 | amd[i] = summation; 71 | } 72 | } 73 | 74 | for (j = minPeriod; j < maxPeriod; j++) { 75 | if (amd[j] < minval) minval = amd[j]; 76 | if (amd[j] > maxval) maxval = amd[j]; 77 | } 78 | 79 | const cutoff = Math.round(sensitivity * (maxval - minval) + minval); 80 | for (j = minPeriod; j <= maxPeriod && amd[j] > cutoff; j++); 81 | 82 | const searchLength = minPeriod / 2; 83 | minval = amd[j]; 84 | let minpos = j; 85 | for (i = j - 1; i < j + searchLength && i <= maxPeriod; i++) { 86 | if (amd[i] < minval) { 87 | minval = amd[i]; 88 | minpos = i; 89 | } 90 | } 91 | 92 | if (Math.round(amd[minpos] * ratio) < maxval) { 93 | return sampleRate / minpos; 94 | } else { 95 | return null; 96 | } 97 | }; 98 | } 99 | -------------------------------------------------------------------------------- /src/detectors/dynamic_wavelet.ts: -------------------------------------------------------------------------------- 1 | import { PitchDetector } from './types'; 2 | 3 | const MAX_FLWT_LEVELS = 6; 4 | const MAX_F = 3000; 5 | const DIFFERENCE_LEVELS_N = 3; 6 | const MAXIMA_THRESHOLD_RATIO = 0.75; 7 | 8 | export interface DynamicWaveletConfig { 9 | sampleRate: number; 10 | } 11 | 12 | const DEFAULT_DYNAMIC_WAVELET_CONFIG: DynamicWaveletConfig = { 13 | sampleRate: 44100, 14 | }; 15 | 16 | export function DynamicWavelet( 17 | params: Partial = {}, 18 | ): PitchDetector { 19 | const config: DynamicWaveletConfig = { 20 | ...DEFAULT_DYNAMIC_WAVELET_CONFIG, 21 | ...params, 22 | }; 23 | const { sampleRate } = config; 24 | 25 | return function DynamicWaveletDetector( 26 | float32AudioBuffer: Float32Array, 27 | ): number | null { 28 | const mins = []; 29 | const maxs = []; 30 | const bufferLength = float32AudioBuffer.length; 31 | 32 | let freq = null; 33 | let theDC = 0; 34 | let minValue = 0; 35 | let maxValue = 0; 36 | 37 | // Compute max amplitude, amplitude threshold, and the DC. 38 | for (let i = 0; i < bufferLength; i++) { 39 | const sample = float32AudioBuffer[i]; 40 | theDC = theDC + sample; 41 | maxValue = Math.max(maxValue, sample); 42 | minValue = Math.min(minValue, sample); 43 | } 44 | 45 | theDC /= bufferLength; 46 | minValue -= theDC; 47 | maxValue -= theDC; 48 | const amplitudeMax = maxValue > -1 * minValue ? maxValue : -1 * minValue; 49 | const amplitudeThreshold = amplitudeMax * MAXIMA_THRESHOLD_RATIO; 50 | 51 | // levels, start without downsampling... 52 | let curLevel = 0; 53 | let curModeDistance = -1; 54 | let curSamNb = float32AudioBuffer.length; 55 | let delta, nbMaxs, nbMins; 56 | 57 | // Search: 58 | while (true) { 59 | delta = ~~(sampleRate / (Math.pow(2, curLevel) * MAX_F)); 60 | if (curSamNb < 2) break; 61 | 62 | let dv; 63 | let previousDV = -1000; 64 | let lastMinIndex = -1000000; 65 | let lastMaxIndex = -1000000; 66 | let findMax = false; 67 | let findMin = false; 68 | 69 | nbMins = 0; 70 | nbMaxs = 0; 71 | 72 | for (let i = 2; i < curSamNb; i++) { 73 | const si = float32AudioBuffer[i] - theDC; 74 | const si1 = float32AudioBuffer[i - 1] - theDC; 75 | 76 | if (si1 <= 0 && si > 0) findMax = true; 77 | if (si1 >= 0 && si < 0) findMin = true; 78 | 79 | // min or max ? 80 | dv = si - si1; 81 | 82 | if (previousDV > -1000) { 83 | if (findMin && previousDV < 0 && dv >= 0) { 84 | // minimum 85 | if (Math.abs(si) >= amplitudeThreshold) { 86 | if (i > lastMinIndex + delta) { 87 | mins[nbMins++] = i; 88 | lastMinIndex = i; 89 | findMin = false; 90 | } 91 | } 92 | } 93 | 94 | if (findMax && previousDV > 0 && dv <= 0) { 95 | // maximum 96 | if (Math.abs(si) >= amplitudeThreshold) { 97 | if (i > lastMaxIndex + delta) { 98 | maxs[nbMaxs++] = i; 99 | lastMaxIndex = i; 100 | findMax = false; 101 | } 102 | } 103 | } 104 | } 105 | previousDV = dv; 106 | } 107 | 108 | if (nbMins === 0 && nbMaxs === 0) { 109 | // No best distance found! 110 | break; 111 | } 112 | 113 | let d; 114 | const distances = []; 115 | 116 | for (let i = 0; i < curSamNb; i++) { 117 | distances[i] = 0; 118 | } 119 | 120 | for (let i = 0; i < nbMins; i++) { 121 | for (let j = 1; j < DIFFERENCE_LEVELS_N; j++) { 122 | if (i + j < nbMins) { 123 | d = Math.abs(mins[i] - mins[i + j]); 124 | distances[d] += 1; 125 | } 126 | } 127 | } 128 | 129 | let bestDistance = -1; 130 | let bestValue = -1; 131 | 132 | for (let i = 0; i < curSamNb; i++) { 133 | let summed = 0; 134 | for (let j = -1 * delta; j <= delta; j++) { 135 | if (i + j >= 0 && i + j < curSamNb) { 136 | summed += distances[i + j]; 137 | } 138 | } 139 | 140 | if (summed === bestValue) { 141 | if (i === 2 * bestDistance) { 142 | bestDistance = i; 143 | } 144 | } else if (summed > bestValue) { 145 | bestValue = summed; 146 | bestDistance = i; 147 | } 148 | } 149 | 150 | // averaging 151 | let distAvg = 0; 152 | let nbDists = 0; 153 | for (let j = -delta; j <= delta; j++) { 154 | if (bestDistance + j >= 0 && bestDistance + j < bufferLength) { 155 | const nbDist = distances[bestDistance + j]; 156 | if (nbDist > 0) { 157 | nbDists += nbDist; 158 | distAvg += (bestDistance + j) * nbDist; 159 | } 160 | } 161 | } 162 | 163 | // This is our mode distance. 164 | distAvg /= nbDists; 165 | 166 | // Continue the levels? 167 | if (curModeDistance > -1) { 168 | if (Math.abs(distAvg * 2 - curModeDistance) <= 2 * delta) { 169 | // two consecutive similar mode distances : ok ! 170 | freq = sampleRate / (Math.pow(2, curLevel - 1) * curModeDistance); 171 | break; 172 | } 173 | } 174 | 175 | // not similar, continue next level; 176 | curModeDistance = distAvg; 177 | 178 | curLevel++; 179 | if (curLevel >= MAX_FLWT_LEVELS || curSamNb < 2) { 180 | break; 181 | } 182 | 183 | //do not modify original audio buffer, make a copy buffer, if 184 | //downsampling is needed (only once). 185 | let newFloat32AudioBuffer = float32AudioBuffer.subarray(0); 186 | if (curSamNb === distances.length) { 187 | newFloat32AudioBuffer = new Float32Array(curSamNb / 2); 188 | } 189 | for (let i = 0; i < curSamNb / 2; i++) { 190 | newFloat32AudioBuffer[i] = 191 | (float32AudioBuffer[2 * i] + float32AudioBuffer[2 * i + 1]) / 2; 192 | } 193 | float32AudioBuffer = newFloat32AudioBuffer; 194 | curSamNb /= 2; 195 | } 196 | 197 | return freq; 198 | }; 199 | } 200 | -------------------------------------------------------------------------------- /src/detectors/fast_yin.ts: -------------------------------------------------------------------------------- 1 | // TODO: Finish me! 2 | 3 | // import FFT from 'fft'; 4 | 5 | // export default function(config) { 6 | 7 | // throw new Error("Unfinished!"); 8 | 9 | // config = config || {}; 10 | 11 | // var DEFAULT_THRESHOLD = 0.10, 12 | // DEFAULT_BUFFER_SIZE = 2048, 13 | // DEFAULT_SAMPLE_RATE = 44100, 14 | // threshold = config.threshold || DEFAULT_THRESHOLD, 15 | // sampleRate = config.sampleRate || DEFAULT_SAMPLE_RATE, 16 | // bufferSize = config.bufferSize || DEFAULT_BUFFER_SIZE, 17 | // yinBuffer = new Float32Array(bufferSize / 2), 18 | // yinBufferLength = bufferSize / 2, 19 | // audioBufferFFT = new Float32Array(2 * bufferSize), 20 | // kernel = new Float32Array(2 * bufferSize), 21 | // yinStyleACF = new Float32Array(2 * bufferSize), 22 | // result = {}; 23 | 24 | // // Implements the difference function using an FFT. 25 | // var difference = function(float32AudioBuffer) { 26 | // // Power term calculation. 27 | // var powerTerms = new Float32Array(bufferSize / 2); 28 | // // First term. 29 | // for (var j = 0; j < bufferSize/2; j++) { 30 | // powerTerms[0] += float32AudioBuffer[j] * float32AudioBuffer[j]; 31 | // } 32 | // // Iteratively calculate later terms. 33 | // for (var tau = 1; tau < bufferSize/2; tau++) { 34 | // powerTerms[tau] = powerTerms[tau-1] - 35 | // float32AudioBuffer[tau-1] * float32AudioBuffer[tau-1] + 36 | // float32AudioBuffer[tau+(bufferSize/2)] * float32AudioBuffer[tau+(bufferSize/2)]; 37 | // } 38 | 39 | // // YIN-style autocorrelation via FFT 40 | // // 1. data 41 | // FFT.complex(audioBufferFFT, float32AudioBuffer, false); 42 | 43 | // // 2. half of the data, disguised as a convolution kernel 44 | // var halfData = new Float32Array(yinBufferLength); 45 | // for (var j = 0; j < yinBufferLength; j++) { 46 | // halfData[j] = float32AudioBuffer[(yinBufferLength-1)-j]; 47 | // } 48 | // FFT.complex(kernel, halfData, false); 49 | 50 | // // 3. Convolution via complex multiplication 51 | 52 | // }; 53 | 54 | // return function() { 55 | 56 | // }; 57 | // } 58 | -------------------------------------------------------------------------------- /src/detectors/goertzel.ts: -------------------------------------------------------------------------------- 1 | // TODO: Make me work 2 | // export default function(frequencies, config) { 3 | // "use strict"; 4 | // config = config || {}; 5 | 6 | // /** 7 | // * If the power in dB is higher than this threshold, the frequency is 8 | // * present in the signal. 9 | // */ 10 | // var POWER_THRESHOLD = config.threshold || 35,// in dB 11 | // /** 12 | // * Sample rate for the hardware, default to 44.1k 13 | // */ 14 | // sampleRate = config.sampleRate || 44100, 15 | 16 | // /** 17 | // * Size of the audio buffer for calculations: 18 | // */ 19 | // bufferSize = config.bufferSize || 2048, 20 | 21 | // /** 22 | // * A list of frequencies to detect. 23 | // */ 24 | // frequenciesToDetect = [], 25 | // /** 26 | // * Cached cosine calculations for each frequency to detect. 27 | // */ 28 | // precalculatedCosines = [], 29 | // /** 30 | // * Cached wnk calculations for each frequency to detect. 31 | // */ 32 | // precalculatedWnk = [], 33 | // /** 34 | // * A calculated power for each frequency to detect. This array is reused for 35 | // * performance reasons. 36 | // */ 37 | // calculatedPowers = []; 38 | 39 | // frequenciesToDetect = frequencies; 40 | // precalculatedCosines = new Array(frequencies.length); 41 | // precalculatedWnk = new Array(frequencies.length); 42 | 43 | // calculatedPowers = new Array(frequencies.length); 44 | 45 | // var i, j, frequenciesToDetectClone; 46 | // for (i = 0; i < frequenciesToDetect.length; i++) { 47 | // precalculatedCosines[i] = 2 * Math.cos(2 * Math.PI * 48 | // frequenciesToDetect[i] / sampleRate); 49 | // precalculatedWnk[i] = Math.exp(-2 * Math.PI * 50 | // frequenciesToDetect[i] / sampleRate); 51 | // } 52 | 53 | // return function(audioFloatBuffer) { 54 | // var skn0, skn1, skn2, 55 | // i, j; 56 | // var numberOfDetectedFrequencies = 0; 57 | // for (j = 0; j < frequenciesToDetect.length; j++) { 58 | // skn0 = skn1 = skn2 = 0; 59 | // for (i = 0; i < audioFloatBuffer.length; i++) { 60 | // skn2 = skn1; 61 | // skn1 = skn0; 62 | // skn0 = precalculatedCosines[j] * skn1 - skn2 + 63 | // audioFloatBuffer[i]; 64 | // } 65 | // var wnk = precalculatedWnk[j]; 66 | // calculatedPowers[j] = 20 * Math.log10(Math.abs(skn0 - wnk * skn1)); 67 | // if (calculatedPowers[j] > POWER_THRESHOLD) { 68 | // numberOfDetectedFrequencies++; 69 | // } 70 | // } 71 | 72 | // if (numberOfDetectedFrequencies > 0) { 73 | // var hits = [], frequency, power; 74 | // frequenciesToDetectClone = [].concat(frequenciesToDetect); 75 | // for (j = 0; j < frequenciesToDetect.length; j++) { 76 | // if (calculatedPowers[j] > POWER_THRESHOLD) { 77 | // frequency = frequenciesToDetect[j]; 78 | // power = calculatedPowers[j]; 79 | // hits.push({ 80 | // frequency: frequency, 81 | // power: power 82 | // }); 83 | // } 84 | // } 85 | // return hits; 86 | // } 87 | // // Otherwise, no hits! 88 | // return -1; 89 | // }; 90 | // } 91 | -------------------------------------------------------------------------------- /src/detectors/macleod.ts: -------------------------------------------------------------------------------- 1 | import { ProbabilityPitch, ProbabalisticPitchDetector } from './types'; 2 | 3 | export interface MacleodConfig { 4 | /** 5 | * The expected size of an audio buffer (in samples). 6 | */ 7 | bufferSize: number; 8 | 9 | /** 10 | * Defines the relative size the chosen peak (pitch) has. 0.93 means: choose 11 | * the first peak that is higher than 93% of the highest peak detected. 93% 12 | * is the default value used in the Tartini user interface. 13 | */ 14 | cutoff: number; 15 | 16 | /** 17 | * Sample rate 18 | */ 19 | sampleRate: number; 20 | } 21 | 22 | const DEFAULT_MACLEOD_PARAMS: MacleodConfig = { 23 | bufferSize: 1024, 24 | cutoff: 0.97, 25 | sampleRate: 44100, 26 | }; 27 | 28 | export function Macleod(params: Partial = {}): ProbabalisticPitchDetector { 29 | const config: MacleodConfig = { 30 | ...DEFAULT_MACLEOD_PARAMS, 31 | ...params, 32 | }; 33 | 34 | const { bufferSize, cutoff, sampleRate } = config; 35 | 36 | /** 37 | * For performance reasons, peaks below this cutoff are not even considered. 38 | */ 39 | const SMALL_CUTOFF = 0.5; 40 | 41 | /** 42 | * Pitch annotations below this threshold are considered invalid, they are 43 | * ignored. 44 | */ 45 | const LOWER_PITCH_CUTOFF = 80; 46 | 47 | /** 48 | * Contains a normalized square difference function value for each delay 49 | * (tau). 50 | */ 51 | const nsdf = new Float32Array(bufferSize); 52 | 53 | /** 54 | * Contains a sum of squares of the Buffer, for improving performance 55 | * (avoids redoing math in the normalized square difference function) 56 | */ 57 | const squaredBufferSum = new Float32Array(bufferSize); 58 | 59 | /** 60 | * The x and y coordinate of the top of the curve (nsdf). 61 | */ 62 | let turningPointX: number; 63 | let turningPointY: number; 64 | 65 | /** 66 | * A list with minimum and maximum values of the nsdf curve. 67 | */ 68 | let maxPositions: Array = []; 69 | 70 | /** 71 | * A list of estimates of the period of the signal (in samples). 72 | */ 73 | let periodEstimates = []; 74 | 75 | /** 76 | * A list of estimates of the amplitudes corresponding with the period 77 | * estimates. 78 | */ 79 | let ampEstimates = []; 80 | 81 | /** 82 | * Implements the normalized square difference function. See section 4 (and 83 | * the explanation before) in the MPM article. This calculation can be 84 | * optimized by using an FFT. The results should remain the same. 85 | */ 86 | function normalizedSquareDifference(float32AudioBuffer: Float32Array): void { 87 | let acf; 88 | let divisorM; 89 | squaredBufferSum[0] = float32AudioBuffer[0] * float32AudioBuffer[0]; 90 | for (let i = 1; i < float32AudioBuffer.length; i += 1) { 91 | squaredBufferSum[i] = 92 | float32AudioBuffer[i] * float32AudioBuffer[i] + squaredBufferSum[i - 1]; 93 | } 94 | for (let tau = 0; tau < float32AudioBuffer.length; tau++) { 95 | acf = 0; 96 | divisorM = 97 | squaredBufferSum[float32AudioBuffer.length - 1 - tau] + 98 | squaredBufferSum[float32AudioBuffer.length - 1] - 99 | squaredBufferSum[tau]; 100 | for (let i = 0; i < float32AudioBuffer.length - tau; i++) { 101 | acf += float32AudioBuffer[i] * float32AudioBuffer[i + tau]; 102 | } 103 | nsdf[tau] = (2 * acf) / divisorM; 104 | } 105 | } 106 | 107 | /** 108 | * Finds the x value corresponding with the peak of a parabola. 109 | * Interpolates between three consecutive points centered on tau. 110 | */ 111 | function parabolicInterpolation(tau: number): void { 112 | const nsdfa = nsdf[tau - 1], 113 | nsdfb = nsdf[tau], 114 | nsdfc = nsdf[tau + 1], 115 | bValue = tau, 116 | bottom = nsdfc + nsdfa - 2 * nsdfb; 117 | if (bottom === 0) { 118 | turningPointX = bValue; 119 | turningPointY = nsdfb; 120 | } else { 121 | const delta = nsdfa - nsdfc; 122 | turningPointX = bValue + delta / (2 * bottom); 123 | turningPointY = nsdfb - (delta * delta) / (8 * bottom); 124 | } 125 | } 126 | 127 | // Finds the highest value between each pair of positive zero crossings. 128 | function peakPicking(): void { 129 | let pos = 0; 130 | let curMaxPos = 0; 131 | 132 | // find the first negative zero crossing. 133 | while (pos < (nsdf.length - 1) / 3 && nsdf[pos] > 0) { 134 | pos++; 135 | } 136 | 137 | // loop over all the values below zero. 138 | while (pos < nsdf.length - 1 && nsdf[pos] <= 0) { 139 | pos++; 140 | } 141 | 142 | // can happen if output[0] is NAN 143 | if (pos == 0) { 144 | pos = 1; 145 | } 146 | 147 | while (pos < nsdf.length - 1) { 148 | if (nsdf[pos] > nsdf[pos - 1] && nsdf[pos] >= nsdf[pos + 1]) { 149 | if (curMaxPos == 0) { 150 | // the first max (between zero crossings) 151 | curMaxPos = pos; 152 | } else if (nsdf[pos] > nsdf[curMaxPos]) { 153 | // a higher max (between the zero crossings) 154 | curMaxPos = pos; 155 | } 156 | } 157 | pos++; 158 | // a negative zero crossing 159 | if (pos < nsdf.length - 1 && nsdf[pos] <= 0) { 160 | // if there was a maximum add it to the list of maxima 161 | if (curMaxPos > 0) { 162 | maxPositions.push(curMaxPos); 163 | curMaxPos = 0; // clear the maximum position, so we start 164 | // looking for a new ones 165 | } 166 | while (pos < nsdf.length - 1 && nsdf[pos] <= 0) { 167 | pos++; // loop over all the values below zero 168 | } 169 | } 170 | } 171 | if (curMaxPos > 0) { 172 | maxPositions.push(curMaxPos); 173 | } 174 | } 175 | 176 | return function Macleod(float32AudioBuffer: Float32Array): ProbabilityPitch { 177 | // 0. Clear old results. 178 | let pitch; 179 | maxPositions = []; 180 | periodEstimates = []; 181 | ampEstimates = []; 182 | 183 | // 1. Calculute the normalized square difference for each Tau value. 184 | normalizedSquareDifference(float32AudioBuffer); 185 | // 2. Peak picking time: time to pick some peaks. 186 | peakPicking(); 187 | 188 | let highestAmplitude = -Infinity; 189 | 190 | for (let i = 0; i < maxPositions.length; i++) { 191 | const tau = maxPositions[i]; 192 | // make sure every annotation has a probability attached 193 | highestAmplitude = Math.max(highestAmplitude, nsdf[tau]); 194 | 195 | if (nsdf[tau] > SMALL_CUTOFF) { 196 | // calculates turningPointX and Y 197 | parabolicInterpolation(tau); 198 | // store the turning points 199 | ampEstimates.push(turningPointY); 200 | periodEstimates.push(turningPointX); 201 | // remember the highest amplitude 202 | highestAmplitude = Math.max(highestAmplitude, turningPointY); 203 | } 204 | } 205 | 206 | if (periodEstimates.length) { 207 | // use the overall maximum to calculate a cutoff. 208 | // The cutoff value is based on the highest value and a relative 209 | // threshold. 210 | const actualCutoff = cutoff * highestAmplitude; 211 | let periodIndex = 0; 212 | 213 | for (let i = 0; i < ampEstimates.length; i++) { 214 | if (ampEstimates[i] >= actualCutoff) { 215 | periodIndex = i; 216 | break; 217 | } 218 | } 219 | 220 | const period = periodEstimates[periodIndex], 221 | pitchEstimate = sampleRate / period; 222 | 223 | if (pitchEstimate > LOWER_PITCH_CUTOFF) { 224 | pitch = pitchEstimate; 225 | } else { 226 | pitch = -1; 227 | } 228 | } else { 229 | // no pitch detected. 230 | pitch = -1; 231 | } 232 | 233 | return { 234 | probability: highestAmplitude, 235 | freq: pitch, 236 | }; 237 | }; 238 | } 239 | -------------------------------------------------------------------------------- /src/detectors/types.ts: -------------------------------------------------------------------------------- 1 | export type PitchDetector = (float32AudioBuffer: Float32Array) => number | null; 2 | export type ProbabalisticPitchDetector = ( 3 | float32AudioBuffer: Float32Array, 4 | ) => ProbabilityPitch; 5 | 6 | export interface ProbabilityPitch { 7 | probability: number; 8 | freq: number; 9 | } 10 | -------------------------------------------------------------------------------- /src/detectors/yin.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2003-2009 Paul Brossier 3 | This file is part of aubio. 4 | aubio is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | aubio is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with aubio. If not, see . 14 | */ 15 | 16 | import { PitchDetector } from './types'; 17 | 18 | /* This algorithm was developed by A. de Cheveigné and H. Kawahara and 19 | * published in: 20 | * 21 | * de Cheveigné, A., Kawahara, H. (2002) "YIN, a fundamental frequency 22 | * estimator for speech and music", J. Acoust. Soc. Am. 111, 1917-1930. 23 | * 24 | * see http://recherche.ircam.fr/equipes/pcm/pub/people/cheveign.html 25 | */ 26 | 27 | export interface YinConfig { 28 | threshold: number; 29 | sampleRate: number; 30 | probabilityThreshold: number; 31 | } 32 | 33 | const DEFAULT_YIN_PARAMS = { 34 | threshold: 0.1, 35 | sampleRate: 44100, 36 | probabilityThreshold: 0.1, 37 | }; 38 | 39 | export function YIN(params: Partial = {}): PitchDetector { 40 | const config: YinConfig = { 41 | ...DEFAULT_YIN_PARAMS, 42 | ...params, 43 | }; 44 | const { threshold, sampleRate, probabilityThreshold } = config; 45 | 46 | return function YINDetector(float32AudioBuffer: Float32Array): number | null { 47 | // Set buffer size to the highest power of two below the provided buffer's length. 48 | let bufferSize; 49 | for (bufferSize = 1; bufferSize < float32AudioBuffer.length; bufferSize *= 2); 50 | bufferSize /= 2; 51 | 52 | // Set up the yinBuffer as described in step one of the YIN paper. 53 | const yinBufferLength = bufferSize / 2; 54 | const yinBuffer = new Float32Array(yinBufferLength); 55 | 56 | let probability = 0, 57 | tau; 58 | 59 | // Compute the difference function as described in step 2 of the YIN paper. 60 | for (let t = 0; t < yinBufferLength; t++) { 61 | yinBuffer[t] = 0; 62 | } 63 | for (let t = 1; t < yinBufferLength; t++) { 64 | for (let i = 0; i < yinBufferLength; i++) { 65 | const delta = float32AudioBuffer[i] - float32AudioBuffer[i + t]; 66 | yinBuffer[t] += delta * delta; 67 | } 68 | } 69 | 70 | // Compute the cumulative mean normalized difference as described in step 3 of the paper. 71 | yinBuffer[0] = 1; 72 | yinBuffer[1] = 1; 73 | let runningSum = 0; 74 | for (let t = 1; t < yinBufferLength; t++) { 75 | runningSum += yinBuffer[t]; 76 | yinBuffer[t] *= t / runningSum; 77 | } 78 | 79 | // Compute the absolute threshold as described in step 4 of the paper. 80 | // Since the first two positions in the array are 1, 81 | // we can start at the third position. 82 | for (tau = 2; tau < yinBufferLength; tau++) { 83 | if (yinBuffer[tau] < threshold) { 84 | while (tau + 1 < yinBufferLength && yinBuffer[tau + 1] < yinBuffer[tau]) { 85 | tau++; 86 | } 87 | // found tau, exit loop and return 88 | // store the probability 89 | // From the YIN paper: The threshold determines the list of 90 | // candidates admitted to the set, and can be interpreted as the 91 | // proportion of aperiodic power tolerated 92 | // within a periodic signal. 93 | // 94 | // Since we want the periodicity and and not aperiodicity: 95 | // periodicity = 1 - aperiodicity 96 | probability = 1 - yinBuffer[tau]; 97 | break; 98 | } 99 | } 100 | 101 | // if no pitch found, return null. 102 | if (tau === yinBufferLength || yinBuffer[tau] >= threshold) { 103 | return null; 104 | } 105 | 106 | // If probability too low, return -1. 107 | if (probability < probabilityThreshold) { 108 | return null; 109 | } 110 | 111 | /** 112 | * Implements step 5 of the AUBIO_YIN paper. It refines the estimated tau 113 | * value using parabolic interpolation. This is needed to detect higher 114 | * frequencies more precisely. See http://fizyka.umk.pl/nrbook/c10-2.pdf and 115 | * for more background 116 | * http://fedc.wiwi.hu-berlin.de/xplore/tutorials/xegbohtmlnode62.html 117 | */ 118 | let betterTau, x0, x2; 119 | if (tau < 1) { 120 | x0 = tau; 121 | } else { 122 | x0 = tau - 1; 123 | } 124 | if (tau + 1 < yinBufferLength) { 125 | x2 = tau + 1; 126 | } else { 127 | x2 = tau; 128 | } 129 | if (x0 === tau) { 130 | if (yinBuffer[tau] <= yinBuffer[x2]) { 131 | betterTau = tau; 132 | } else { 133 | betterTau = x2; 134 | } 135 | } else if (x2 === tau) { 136 | if (yinBuffer[tau] <= yinBuffer[x0]) { 137 | betterTau = tau; 138 | } else { 139 | betterTau = x0; 140 | } 141 | } else { 142 | const s0 = yinBuffer[x0]; 143 | const s1 = yinBuffer[tau]; 144 | const s2 = yinBuffer[x2]; 145 | // fixed AUBIO implementation, thanks to Karl Helgason: 146 | // (2.0f * s1 - s2 - s0) was incorrectly multiplied with -1 147 | betterTau = tau + (s2 - s0) / (2 * (2 * s1 - s2 - s0)); 148 | } 149 | 150 | return sampleRate / betterTau; 151 | }; 152 | } 153 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { YIN, YinConfig } from './detectors/yin'; 2 | import { AMDF, AMDFConfig } from './detectors/amdf'; 3 | import { ACF2PLUS, ACF2Config } from './detectors/acf2plus'; 4 | import { DynamicWavelet, DynamicWaveletConfig } from './detectors/dynamic_wavelet'; 5 | import { Macleod, MacleodConfig } from './detectors/macleod'; 6 | 7 | import { frequencies } from './tools/frequencies'; 8 | 9 | export { 10 | YIN, 11 | YinConfig, 12 | AMDF, 13 | AMDFConfig, 14 | ACF2PLUS, 15 | ACF2Config, 16 | DynamicWavelet, 17 | DynamicWaveletConfig, 18 | Macleod, 19 | MacleodConfig, 20 | frequencies, 21 | }; 22 | 23 | export default { 24 | YIN, 25 | AMDF, 26 | ACF2PLUS, 27 | DynamicWavelet, 28 | Macleod, 29 | frequencies, 30 | }; 31 | -------------------------------------------------------------------------------- /src/tools/frequencies.ts: -------------------------------------------------------------------------------- 1 | import { PitchDetector } from '../detectors/types'; 2 | 3 | export const DEFAULT_FREQUENCIES_PARAMS: FrequenciesParams = { 4 | tempo: 120, 5 | quantization: 4, 6 | sampleRate: 44100, 7 | }; 8 | 9 | function pitchConsensus(detectors: Array, chunk: Float32Array): number { 10 | const pitches: Array = detectors 11 | .map((fn) => fn(chunk)) 12 | .filter((value: T | null): value is T => value !== null) 13 | .sort((a: number, b: number) => a - b); 14 | 15 | // In the case of one pitch, return it. 16 | if (pitches.length === 1) { 17 | return pitches[0]; 18 | 19 | // In the case of two pitches, return the geometric mean if they 20 | // are close to each other, and the lower pitch otherwise. 21 | } else if (pitches.length === 2) { 22 | const [first, second] = pitches; 23 | return first * 2 > second ? Math.sqrt(first * second) : first; 24 | 25 | // In the case of three or more pitches, filter away the extremes 26 | // if they are very extreme, then take the geometric mean. 27 | } else { 28 | const first = pitches[0]; 29 | const second = pitches[1]; 30 | const secondToLast = pitches[pitches.length - 2]; 31 | const last = pitches[pitches.length - 1]; 32 | 33 | const filtered1 = first * 2 > second ? pitches : pitches.slice(1); 34 | const filtered2 = secondToLast * 2 > last ? filtered1 : filtered1.slice(0, -1); 35 | return Math.pow( 36 | filtered2.reduce((t, p) => t * p, 1), 37 | 1 / filtered2.length, 38 | ); 39 | } 40 | } 41 | 42 | interface FrequenciesParams { 43 | tempo: number; 44 | quantization: number; 45 | sampleRate: number; 46 | } 47 | 48 | export function frequencies( 49 | detector: PitchDetector | Array, 50 | float32AudioBuffer: Float32Array, 51 | options: Partial = {}, 52 | ): Array { 53 | const config = { 54 | ...DEFAULT_FREQUENCIES_PARAMS, 55 | ...options, 56 | }; 57 | const { tempo, quantization, sampleRate } = config; 58 | 59 | const bufferLength = float32AudioBuffer.length; 60 | const chunkSize = Math.round((sampleRate * 60) / (quantization * tempo)); 61 | 62 | let getPitch; 63 | if (Array.isArray(detector)) { 64 | getPitch = pitchConsensus.bind(null, detector); 65 | } else { 66 | getPitch = detector; 67 | } 68 | 69 | const pitches: Array = []; 70 | for (let i = 0, max = bufferLength - chunkSize; i <= max; i += chunkSize) { 71 | const chunk = float32AudioBuffer.slice(i, i + chunkSize); 72 | const pitch = getPitch(chunk); 73 | pitches.push(pitch); 74 | } 75 | 76 | return pitches; 77 | } 78 | -------------------------------------------------------------------------------- /test/index.ts: -------------------------------------------------------------------------------- 1 | import fs from 'mz/fs'; 2 | import expect from 'expect'; 3 | import Pitchfinder from '../src'; 4 | import { resolve } from 'path'; 5 | import WavDecoder from 'wav-decoder'; 6 | import { PitchDetector } from '../src/detectors/types'; 7 | 8 | const path = (...args: Array): string => resolve(__dirname, ...args); 9 | const decode = async (buffer: Buffer): Promise => { 10 | const decoded: { 11 | sampleRate: number; 12 | channelData: Array; 13 | } = await WavDecoder.decode(buffer); 14 | return decoded.channelData[0]; 15 | }; 16 | describe('Pitchfinder', () => { 17 | const detectors = { 18 | AMDF: Pitchfinder.AMDF(), 19 | DynamicWavelet: Pitchfinder.DynamicWavelet(), 20 | YIN: Pitchfinder.YIN(), 21 | Macleod: Pitchfinder.Macleod(), 22 | ACF2PLUS: Pitchfinder.ACF2PLUS(), 23 | }; 24 | 25 | const pitchSamples = fs.readdirSync(path('pitches')); 26 | 27 | describe('Detectors', () => { 28 | Object.keys(detectors).forEach((name) => { 29 | const detector: PitchDetector = detectors[name]; 30 | describe(name, () => { 31 | pitchSamples.forEach((fileName) => { 32 | const [hz, type] = fileName.replace('.wav', '').split('_'); 33 | 34 | it(`Detects ${type} wave at ${hz} hz`, () => { 35 | return fs 36 | .readFile(path('pitches', fileName)) 37 | .then(decode) 38 | .then(detector) 39 | .then((pitch) => { 40 | if (pitch == null) throw new Error('No frequency detected'); 41 | const diff = Math.abs(pitch - Number(hz)); 42 | if (diff > 10) 43 | throw new Error( 44 | `Too large an error - detected wave at ${hz} as ${pitch} hz`, 45 | ); 46 | }); 47 | }); 48 | }); 49 | }); 50 | }); 51 | }); 52 | 53 | describe('AMDF minimum/maximum frequency parameters', () => { 54 | const detector = (minFreq, maxFreq) => 55 | Pitchfinder.AMDF({ 56 | minFrequency: minFreq, 57 | maxFrequency: maxFreq, 58 | }); 59 | pitchSamples.forEach((fileName) => { 60 | const [hzStr, type] = fileName.replace('.wav', '').split('_'); 61 | const hz = Number(hzStr); 62 | const freqOffset = 100; 63 | const params = [ 64 | { minFreq: hz, maxFreq: hz + freqOffset }, 65 | { minFreq: hz - freqOffset, maxFreq: hz }, 66 | ]; 67 | 68 | params.forEach((freqs) => { 69 | const minFreq = freqs.minFreq; 70 | const maxFreq = freqs.maxFreq; 71 | it(`Detects ${type} wave at ${hzStr} hz with minimumFrequency ${minFreq} hz and maximumFrequency ${maxFreq} hz`, () => { 72 | return fs 73 | .readFile(path('pitches', fileName)) 74 | .then(decode) 75 | .then(detector(minFreq, maxFreq)) 76 | .then((pitch) => { 77 | if (pitch == null) throw new Error('No frequency detected'); 78 | const diff = Math.abs(pitch - hz); 79 | if (diff > 10) 80 | throw new Error( 81 | `Too large an error - detected wave at ${hzStr} as ${pitch} hz`, 82 | ); 83 | }); 84 | }); 85 | }); 86 | }); 87 | }); 88 | 89 | describe('Frequencies tool', () => { 90 | describe('C-major scale, electric piano, quarter notes, 120 bpm', () => { 91 | const sample = 'c_major_scale_electric_piano_120.wav'; 92 | const round = (x: number | null): number | null => 93 | x == null ? null : Number(x.toFixed(4)); 94 | 95 | // The actual frequencies are: 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, and 523.25 96 | 97 | describe('16th-note quantization (default)', () => { 98 | it('AMDF slow and somewhat inaccurate, but gets all frequencies', () => { 99 | return fs 100 | .readFile(path('melodies', sample)) 101 | .then(decode) 102 | .then((data) => Pitchfinder.frequencies(detectors.AMDF, data)) 103 | .then((frequencies) => { 104 | expect(frequencies.map(round)).toEqual([ 105 | 260.9467, 106 | 260.9467, 107 | 260.9467, 108 | 260.9467, 109 | 294, 110 | 294, 111 | 294, 112 | 294, 113 | 329.1045, 114 | 329.1045, 115 | 329.1045, 116 | 329.1045, 117 | 350, 118 | 350, 119 | 350, 120 | 350, 121 | 393.75, 122 | 393.75, 123 | 393.75, 124 | 393.75, 125 | 441, 126 | 441, 127 | 441, 128 | 441, 129 | 495.5056, 130 | 495.5056, 131 | 495.5056, 132 | 495.5056, 133 | 525, 134 | 525, 135 | 525, 136 | ]); 137 | }); 138 | }); 139 | 140 | it('Dynamic Wavelet is fast and pretty accurate but misses the beginnings of low frequencies', () => { 141 | return fs 142 | .readFile(path('melodies', sample)) 143 | .then(decode) 144 | .then((data) => Pitchfinder.frequencies(detectors.DynamicWavelet, data)) 145 | .then((frequencies) => { 146 | expect(frequencies.map(round)).toEqual([ 147 | null, 148 | null, 149 | 261.542, 150 | 261.6505, 151 | null, 152 | null, 153 | 293.8493, 154 | 293.6737, 155 | 310.5634, 156 | 330.3371, 157 | 329.5516, 158 | 329.7607, 159 | 347.929, 160 | 349.125, 161 | 349.4058, 162 | 349.2769, 163 | 390.7595, 164 | 392.1341, 165 | 392.2812, 166 | 392.3077, 167 | 428.1553, 168 | 440.4966, 169 | 440.1996, 170 | 440.3476, 171 | 483.5526, 172 | 493.9793, 173 | 494.2516, 174 | 494.2099, 175 | 523.9604, 176 | 523.1547, 177 | 523.3227, 178 | ]); 179 | }); 180 | }); 181 | 182 | it('YIN is accurate but misses one frequency', () => { 183 | return fs 184 | .readFile(path('melodies', sample)) 185 | .then(decode) 186 | .then((data) => Pitchfinder.frequencies(detectors.YIN, data)) 187 | .then((frequencies) => { 188 | expect(frequencies.map(round)).toEqual([ 189 | 261.7419, 190 | 261.7137, 191 | 261.6266, 192 | 261.6543, 193 | 293.1462, 194 | 293.6443, 195 | 293.6985, 196 | 293.582, 197 | 329.0285, 198 | 329.7834, 199 | 329.6526, 200 | 329.8027, 201 | 349.3526, 202 | 349.2973, 203 | 349.3851, 204 | 19018.1432, 205 | 392.1011, 206 | 391.9778, 207 | 392.2077, 208 | 392.2192, 209 | 439.3881, 210 | 440.3376, 211 | 440.3561, 212 | 440.4005, 213 | 492.092, 214 | 493.6956, 215 | 494.2412, 216 | 494.0726, 217 | 523.069, 218 | 522.9648, 219 | 523.3838, 220 | ]); 221 | }); 222 | }); 223 | 224 | it('Average of multiple detectors is accurate', () => { 225 | return fs 226 | .readFile(path('melodies', sample)) 227 | .then(decode) 228 | .then((data) => 229 | Pitchfinder.frequencies( 230 | [detectors.YIN, detectors.AMDF, detectors.DynamicWavelet], 231 | data, 232 | ), 233 | ) 234 | .then((frequencies) => { 235 | expect(frequencies.map(round)).toEqual([ 236 | 261.344, 237 | 261.33, 238 | 261.3716, 239 | 261.417, 240 | 293.5728, 241 | 293.8221, 242 | 293.8493, 243 | 293.7518, 244 | 322.7794, 245 | 329.7413, 246 | 329.4361, 247 | 329.5558, 248 | 349.0928, 249 | 349.4739, 250 | 349.5968, 251 | 349.6382, 252 | 392.2016, 253 | 392.6198, 254 | 392.7457, 255 | 392.7583, 256 | 436.1435, 257 | 440.6113, 258 | 440.5184, 259 | 440.5826, 260 | 490.3576, 261 | 494.3929, 262 | 494.6658, 263 | 494.5956, 264 | 524.0092, 265 | 523.7057, 266 | 523.9016, 267 | ]); 268 | }); 269 | }); 270 | }); 271 | 272 | describe('quarter-note quantization', () => { 273 | it('AMDF slow and somewhat inaccurate, but gets all frequencies', () => { 274 | return fs 275 | .readFile(path('melodies', sample)) 276 | .then(decode) 277 | .then((data) => 278 | Pitchfinder.frequencies(detectors.AMDF, data, { quantization: 1 }), 279 | ) 280 | .then((frequencies) => { 281 | expect(frequencies.map(round)).toEqual([ 282 | 260.9467, 283 | 294, 284 | 329.1045, 285 | 350, 286 | 393.75, 287 | 441, 288 | 495.5056, 289 | 525, 290 | ]); 291 | }); 292 | }); 293 | 294 | it('Dynamic Wavelet misses the low frequencies and has accuracy issues', () => { 295 | return fs 296 | .readFile(path('melodies', sample)) 297 | .then(decode) 298 | .then((data) => 299 | Pitchfinder.frequencies(detectors.DynamicWavelet, data, { 300 | quantization: 1, 301 | }), 302 | ) 303 | .then((frequencies) => { 304 | expect(frequencies.map(round)).toEqual([ 305 | null, 306 | null, 307 | 310.5634, 308 | 346.9406, 309 | 390.7595, 310 | 428.1553, 311 | 483.5526, 312 | 523.9604, 313 | ]); 314 | }); 315 | }); 316 | 317 | it('YIN is good but slow', () => { 318 | return fs 319 | .readFile(path('melodies', sample)) 320 | .then(decode) 321 | .then((data) => 322 | Pitchfinder.frequencies(detectors.YIN, data, { quantization: 1 }), 323 | ) 324 | .then((frequencies) => { 325 | expect(frequencies.map(round)).toEqual([ 326 | 261.6967, 327 | 293.3619, 328 | 329.4029, 329 | 349.3471, 330 | 392.2134, 331 | 439.9719, 332 | 493.0456, 333 | 523.2901, 334 | ]); 335 | }); 336 | }); 337 | 338 | it('Average of multiple detectors is good but very slow', () => { 339 | return fs 340 | .readFile(path('melodies', sample)) 341 | .then(decode) 342 | .then((data) => 343 | Pitchfinder.frequencies( 344 | [detectors.YIN, detectors.AMDF, detectors.DynamicWavelet], 345 | data, 346 | { quantization: 1 }, 347 | ), 348 | ) 349 | .then((frequencies) => { 350 | expect(frequencies.map(round)).toEqual([ 351 | 261.3214, 352 | 293.6808, 353 | 322.9018, 354 | 348.7601, 355 | 392.2391, 356 | 436.3366, 357 | 490.6741, 358 | 524.083, 359 | ]); 360 | }); 361 | }); 362 | }); 363 | }); 364 | }); 365 | 366 | // xdescribe("Notes tool", () => { 367 | // describe("C-major scale, electric piano, quarter notes, 120 bpm", () => { 368 | // const sample = "c_major_scale_electric_piano_120.wav"; 369 | // const getMIDI = note => (note == null ? null : note.midi()); 370 | 371 | // describe("16th-note quantization (default)", () => { 372 | // it("AMDF is slow but gets all notes", () => { 373 | // return fs 374 | // .readFile(path("melodies", sample)) 375 | // .then(decode) 376 | // .then(data => Pitchfinder.notes(detectors.AMDF, data)) 377 | // .then(notes => 378 | // expect(notes.map(getMIDI)).toEqual([ 379 | // 60, 380 | // 60, 381 | // 60, 382 | // 60, 383 | // 62, 384 | // 62, 385 | // 62, 386 | // 62, 387 | // 64, 388 | // 64, 389 | // 64, 390 | // 64, 391 | // 65, 392 | // 65, 393 | // 65, 394 | // 65, 395 | // 67, 396 | // 67, 397 | // 67, 398 | // 67, 399 | // 69, 400 | // 69, 401 | // 69, 402 | // 69, 403 | // 71, 404 | // 71, 405 | // 71, 406 | // 71, 407 | // 72, 408 | // 72, 409 | // 72 410 | // ]) 411 | // ); 412 | // }); 413 | 414 | // it("Dynamic Wavelet is pretty accurate but misses the beginnings of low notes", () => { 415 | // return fs 416 | // .readFile(path("melodies", sample)) 417 | // .then(decode) 418 | // .then(data => Pitchfinder.notes(detectors.DynamicWavelet, data)) 419 | // .then(notes => 420 | // expect(notes.map(getMIDI)).toEqual([ 421 | // null, 422 | // null, 423 | // 60, 424 | // 60, 425 | // null, 426 | // null, 427 | // 62, 428 | // 62, 429 | // 63, 430 | // 64, 431 | // 64, 432 | // 64, 433 | // 65, 434 | // 65, 435 | // 65, 436 | // 65, 437 | // 67, 438 | // 67, 439 | // 67, 440 | // 67, 441 | // 69, 442 | // 69, 443 | // 69, 444 | // 69, 445 | // 71, 446 | // 71, 447 | // 71, 448 | // 71, 449 | // 72, 450 | // 72, 451 | // 72 452 | // ]) 453 | // ); 454 | // }); 455 | 456 | // it("YIN misses one note", () => { 457 | // return fs 458 | // .readFile(path("melodies", sample)) 459 | // .then(decode) 460 | // .then(data => Pitchfinder.notes(detectors.YIN, data)) 461 | // .then(notes => 462 | // expect(notes.map(getMIDI)).toEqual([ 463 | // 60, 464 | // 60, 465 | // 60, 466 | // 60, 467 | // 62, 468 | // 62, 469 | // 62, 470 | // 62, 471 | // 64, 472 | // 64, 473 | // 64, 474 | // 64, 475 | // 65, 476 | // 65, 477 | // 65, 478 | // 134, 479 | // 67, 480 | // 67, 481 | // 67, 482 | // 67, 483 | // 69, 484 | // 69, 485 | // 69, 486 | // 69, 487 | // 71, 488 | // 71, 489 | // 71, 490 | // 71, 491 | // 72, 492 | // 72, 493 | // 72 494 | // ]) 495 | // ); 496 | // }); 497 | 498 | // it("Average of multiple detectors gets all notes", () => { 499 | // return fs 500 | // .readFile(path("melodies", sample)) 501 | // .then(decode) 502 | // .then(data => 503 | // Pitchfinder.notes( 504 | // [detectors.YIN, detectors.AMDF, detectors.DynamicWavelet], 505 | // data 506 | // ) 507 | // ) 508 | // .then(notes => 509 | // expect(notes.map(getMIDI)).toEqual([ 510 | // 60, 511 | // 60, 512 | // 60, 513 | // 60, 514 | // 62, 515 | // 62, 516 | // 62, 517 | // 62, 518 | // 64, 519 | // 64, 520 | // 64, 521 | // 64, 522 | // 65, 523 | // 65, 524 | // 65, 525 | // 65, 526 | // 67, 527 | // 67, 528 | // 67, 529 | // 67, 530 | // 69, 531 | // 69, 532 | // 69, 533 | // 69, 534 | // 71, 535 | // 71, 536 | // 71, 537 | // 71, 538 | // 72, 539 | // 72, 540 | // 72 541 | // ]) 542 | // ); 543 | // }); 544 | // }); 545 | 546 | // describe("quarter-note quantization", () => { 547 | // it("AMDF slow but gets all notes", () => { 548 | // return fs 549 | // .readFile(path("melodies", sample)) 550 | // .then(decode) 551 | // .then(data => 552 | // Pitchfinder.notes(detectors.AMDF, data, { quantization: 1 }) 553 | // ) 554 | // .then(notes => 555 | // expect(notes.map(getMIDI)).toEqual([ 556 | // 60, 557 | // 62, 558 | // 64, 559 | // 65, 560 | // 67, 561 | // 69, 562 | // 71, 563 | // 72 564 | // ]) 565 | // ); 566 | // }); 567 | 568 | // it("Dynamic Wavelet misses the low notes", () => { 569 | // return fs 570 | // .readFile(path("melodies", sample)) 571 | // .then(decode) 572 | // .then(data => 573 | // Pitchfinder.notes(detectors.DynamicWavelet, data, { 574 | // quantization: 1 575 | // }) 576 | // ) 577 | // .then(notes => 578 | // expect(notes.map(getMIDI)).toEqual([ 579 | // null, 580 | // null, 581 | // 63, 582 | // 65, 583 | // 67, 584 | // 69, 585 | // 71, 586 | // 72 587 | // ]) 588 | // ); 589 | // }); 590 | 591 | // it("YIN is slow but gets all notes", () => { 592 | // return fs 593 | // .readFile(path("melodies", sample)) 594 | // .then(decode) 595 | // .then(data => 596 | // Pitchfinder.notes(detectors.YIN, data, { quantization: 1 }) 597 | // ) 598 | // .then(notes => 599 | // expect(notes.map(getMIDI)).toEqual([ 600 | // 60, 601 | // 62, 602 | // 64, 603 | // 65, 604 | // 67, 605 | // 69, 606 | // 71, 607 | // 72 608 | // ]) 609 | // ); 610 | // }); 611 | 612 | // it("Average of multiple detectors gets all notes but is very slow", () => { 613 | // return fs 614 | // .readFile(path("melodies", sample)) 615 | // .then(decode) 616 | // .then(data => 617 | // Pitchfinder.notes( 618 | // [detectors.YIN, detectors.AMDF, detectors.DynamicWavelet], 619 | // data, 620 | // { quantization: 1 } 621 | // ) 622 | // ) 623 | // .then(notes => 624 | // expect(notes.map(getMIDI)).toEqual([ 625 | // 60, 626 | // 62, 627 | // 64, 628 | // 65, 629 | // 67, 630 | // 69, 631 | // 71, 632 | // 72 633 | // ]) 634 | // ); 635 | // }); 636 | // }); 637 | // }); 638 | // }); 639 | 640 | // describe('Harmony tool', () => {}); 641 | }); 642 | -------------------------------------------------------------------------------- /test/melodies/c_major_scale_electric_piano_120.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterkhayes/pitchfinder/886dbd8826eb69b08f04232ff2334b4ccde01eb7/test/melodies/c_major_scale_electric_piano_120.wav -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require ts-node/register 2 | --recursive 3 | --reporter spec 4 | --ui bdd 5 | --timeout 20000 6 | test/**/*.ts -------------------------------------------------------------------------------- /test/pitches/262_sine.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterkhayes/pitchfinder/886dbd8826eb69b08f04232ff2334b4ccde01eb7/test/pitches/262_sine.wav -------------------------------------------------------------------------------- /test/pitches/440_square.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterkhayes/pitchfinder/886dbd8826eb69b08f04232ff2334b4ccde01eb7/test/pitches/440_square.wav -------------------------------------------------------------------------------- /test/pitches/587_saw.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterkhayes/pitchfinder/886dbd8826eb69b08f04232ff2334b4ccde01eb7/test/pitches/587_saw.wav -------------------------------------------------------------------------------- /test/pitches/988_triangle.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterkhayes/pitchfinder/886dbd8826eb69b08f04232ff2334b4ccde01eb7/test/pitches/988_triangle.wav -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "declaration": true, 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ 7 | "incremental": true, 8 | "outDir": "./lib", 9 | "target": "es5" 10 | }, 11 | "include": [ "./src/**/*" ] 12 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== 9 | dependencies: 10 | "@babel/highlight" "^7.8.3" 11 | 12 | "@babel/helper-validator-identifier@^7.9.0": 13 | version "7.9.5" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" 15 | integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== 16 | 17 | "@babel/highlight@^7.8.3": 18 | version "7.9.0" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" 20 | integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.9.0" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@babel/runtime-corejs3@^7.8.3": 27 | version "7.9.6" 28 | resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz#67aded13fffbbc2cb93247388cf84d77a4be9a71" 29 | integrity sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA== 30 | dependencies: 31 | core-js-pure "^3.0.0" 32 | regenerator-runtime "^0.13.4" 33 | 34 | "@jest/types@^26.0.1": 35 | version "26.0.1" 36 | resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.0.1.tgz#b78333fbd113fa7aec8d39de24f88de8686dac67" 37 | integrity sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA== 38 | dependencies: 39 | "@types/istanbul-lib-coverage" "^2.0.0" 40 | "@types/istanbul-reports" "^1.1.1" 41 | "@types/yargs" "^15.0.0" 42 | chalk "^4.0.0" 43 | 44 | "@types/color-name@^1.1.1": 45 | version "1.1.1" 46 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 47 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 48 | 49 | "@types/eslint-visitor-keys@^1.0.0": 50 | version "1.0.0" 51 | resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" 52 | integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== 53 | 54 | "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": 55 | version "2.0.1" 56 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" 57 | integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== 58 | 59 | "@types/istanbul-lib-report@*": 60 | version "3.0.0" 61 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" 62 | integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== 63 | dependencies: 64 | "@types/istanbul-lib-coverage" "*" 65 | 66 | "@types/istanbul-reports@^1.1.1": 67 | version "1.1.1" 68 | resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" 69 | integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== 70 | dependencies: 71 | "@types/istanbul-lib-coverage" "*" 72 | "@types/istanbul-lib-report" "*" 73 | 74 | "@types/json-schema@^7.0.3": 75 | version "7.0.4" 76 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" 77 | integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== 78 | 79 | "@types/mocha@^7.0.2": 80 | version "7.0.2" 81 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" 82 | integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== 83 | 84 | "@types/mz@^2.7.0": 85 | version "2.7.0" 86 | resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.0.tgz#3ef27f457c4c3e8b197ca2670ee41d6f4effddf2" 87 | integrity sha512-Q5TZYMKnH0hdV5fNstmMWL2LLw5eRRtTd73KNtsZxoQ2gtCQyET5X79uERUEwGneuxPglg441I7OSY00+9CkSw== 88 | dependencies: 89 | "@types/node" "*" 90 | 91 | "@types/node@*", "@types/node@^13.13.4": 92 | version "13.13.4" 93 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" 94 | integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== 95 | 96 | "@types/stack-utils@^1.0.1": 97 | version "1.0.1" 98 | resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" 99 | integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== 100 | 101 | "@types/yargs-parser@*": 102 | version "15.0.0" 103 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" 104 | integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== 105 | 106 | "@types/yargs@^15.0.0": 107 | version "15.0.4" 108 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" 109 | integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== 110 | dependencies: 111 | "@types/yargs-parser" "*" 112 | 113 | "@typescript-eslint/eslint-plugin@^2.27.0": 114 | version "2.31.0" 115 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz#942c921fec5e200b79593c71fafb1e3f57aa2e36" 116 | integrity sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg== 117 | dependencies: 118 | "@typescript-eslint/experimental-utils" "2.31.0" 119 | functional-red-black-tree "^1.0.1" 120 | regexpp "^3.0.0" 121 | tsutils "^3.17.1" 122 | 123 | "@typescript-eslint/experimental-utils@2.31.0", "@typescript-eslint/experimental-utils@^2.5.0": 124 | version "2.31.0" 125 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz#a9ec514bf7fd5e5e82bc10dcb6a86d58baae9508" 126 | integrity sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA== 127 | dependencies: 128 | "@types/json-schema" "^7.0.3" 129 | "@typescript-eslint/typescript-estree" "2.31.0" 130 | eslint-scope "^5.0.0" 131 | eslint-utils "^2.0.0" 132 | 133 | "@typescript-eslint/parser@^2.27.0": 134 | version "2.31.0" 135 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.31.0.tgz#beddd4e8efe64995108b229b2862cd5752d40d6f" 136 | integrity sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ== 137 | dependencies: 138 | "@types/eslint-visitor-keys" "^1.0.0" 139 | "@typescript-eslint/experimental-utils" "2.31.0" 140 | "@typescript-eslint/typescript-estree" "2.31.0" 141 | eslint-visitor-keys "^1.1.0" 142 | 143 | "@typescript-eslint/typescript-estree@2.31.0": 144 | version "2.31.0" 145 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz#ac536c2d46672aa1f27ba0ec2140d53670635cfd" 146 | integrity sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA== 147 | dependencies: 148 | debug "^4.1.1" 149 | eslint-visitor-keys "^1.1.0" 150 | glob "^7.1.6" 151 | is-glob "^4.0.1" 152 | lodash "^4.17.15" 153 | semver "^6.3.0" 154 | tsutils "^3.17.1" 155 | 156 | acorn-jsx@^5.2.0: 157 | version "5.2.0" 158 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 159 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 160 | 161 | acorn@^7.1.1: 162 | version "7.1.1" 163 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 164 | integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== 165 | 166 | ajv@^6.10.0, ajv@^6.10.2: 167 | version "6.12.2" 168 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 169 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== 170 | dependencies: 171 | fast-deep-equal "^3.1.1" 172 | fast-json-stable-stringify "^2.0.0" 173 | json-schema-traverse "^0.4.1" 174 | uri-js "^4.2.2" 175 | 176 | ansi-colors@3.2.3: 177 | version "3.2.3" 178 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 179 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 180 | 181 | ansi-escapes@^4.2.1: 182 | version "4.3.1" 183 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 184 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 185 | dependencies: 186 | type-fest "^0.11.0" 187 | 188 | ansi-regex@^3.0.0: 189 | version "3.0.0" 190 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 191 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 192 | 193 | ansi-regex@^4.1.0: 194 | version "4.1.0" 195 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 196 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 197 | 198 | ansi-regex@^5.0.0: 199 | version "5.0.0" 200 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 201 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 202 | 203 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 204 | version "3.2.1" 205 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 206 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 207 | dependencies: 208 | color-convert "^1.9.0" 209 | 210 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 211 | version "4.2.1" 212 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 213 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 214 | dependencies: 215 | "@types/color-name" "^1.1.1" 216 | color-convert "^2.0.1" 217 | 218 | any-promise@^1.0.0: 219 | version "1.3.0" 220 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 221 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 222 | 223 | anymatch@~3.1.1: 224 | version "3.1.1" 225 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 226 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 227 | dependencies: 228 | normalize-path "^3.0.0" 229 | picomatch "^2.0.4" 230 | 231 | arg@^4.1.0: 232 | version "4.1.3" 233 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 234 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 235 | 236 | argparse@^1.0.7: 237 | version "1.0.10" 238 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 239 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 240 | dependencies: 241 | sprintf-js "~1.0.2" 242 | 243 | array-includes@^3.0.3, array-includes@^3.1.1: 244 | version "3.1.1" 245 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" 246 | integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== 247 | dependencies: 248 | define-properties "^1.1.3" 249 | es-abstract "^1.17.0" 250 | is-string "^1.0.5" 251 | 252 | astral-regex@^1.0.0: 253 | version "1.0.0" 254 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 255 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 256 | 257 | balanced-match@^1.0.0: 258 | version "1.0.0" 259 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 260 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 261 | 262 | binary-extensions@^2.0.0: 263 | version "2.0.0" 264 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 265 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 266 | 267 | brace-expansion@^1.1.7: 268 | version "1.1.11" 269 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 270 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 271 | dependencies: 272 | balanced-match "^1.0.0" 273 | concat-map "0.0.1" 274 | 275 | braces@^3.0.1, braces@~3.0.2: 276 | version "3.0.2" 277 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 278 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 279 | dependencies: 280 | fill-range "^7.0.1" 281 | 282 | browser-stdout@1.3.1: 283 | version "1.3.1" 284 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 285 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 286 | 287 | buffer-alloc-unsafe@^1.1.0: 288 | version "1.1.0" 289 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 290 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 291 | 292 | buffer-alloc@^1.1.0: 293 | version "1.2.0" 294 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 295 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 296 | dependencies: 297 | buffer-alloc-unsafe "^1.1.0" 298 | buffer-fill "^1.0.0" 299 | 300 | buffer-fill@^1.0.0: 301 | version "1.0.0" 302 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 303 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 304 | 305 | buffer-from@^1.0.0: 306 | version "1.1.1" 307 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 308 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 309 | 310 | callsites@^3.0.0: 311 | version "3.1.0" 312 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 313 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 314 | 315 | camelcase@^5.0.0: 316 | version "5.3.1" 317 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 318 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 319 | 320 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: 321 | version "2.4.2" 322 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 323 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 324 | dependencies: 325 | ansi-styles "^3.2.1" 326 | escape-string-regexp "^1.0.5" 327 | supports-color "^5.3.0" 328 | 329 | chalk@^3.0.0: 330 | version "3.0.0" 331 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 332 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 333 | dependencies: 334 | ansi-styles "^4.1.0" 335 | supports-color "^7.1.0" 336 | 337 | chalk@^4.0.0: 338 | version "4.0.0" 339 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" 340 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== 341 | dependencies: 342 | ansi-styles "^4.1.0" 343 | supports-color "^7.1.0" 344 | 345 | chardet@^0.7.0: 346 | version "0.7.0" 347 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 348 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 349 | 350 | chokidar@3.3.0: 351 | version "3.3.0" 352 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 353 | integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== 354 | dependencies: 355 | anymatch "~3.1.1" 356 | braces "~3.0.2" 357 | glob-parent "~5.1.0" 358 | is-binary-path "~2.1.0" 359 | is-glob "~4.0.1" 360 | normalize-path "~3.0.0" 361 | readdirp "~3.2.0" 362 | optionalDependencies: 363 | fsevents "~2.1.1" 364 | 365 | cli-cursor@^3.1.0: 366 | version "3.1.0" 367 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 368 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 369 | dependencies: 370 | restore-cursor "^3.1.0" 371 | 372 | cli-width@^2.0.0: 373 | version "2.2.1" 374 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 375 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 376 | 377 | cliui@^5.0.0: 378 | version "5.0.0" 379 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 380 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 381 | dependencies: 382 | string-width "^3.1.0" 383 | strip-ansi "^5.2.0" 384 | wrap-ansi "^5.1.0" 385 | 386 | color-convert@^1.9.0: 387 | version "1.9.3" 388 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 389 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 390 | dependencies: 391 | color-name "1.1.3" 392 | 393 | color-convert@^2.0.1: 394 | version "2.0.1" 395 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 396 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 397 | dependencies: 398 | color-name "~1.1.4" 399 | 400 | color-name@1.1.3: 401 | version "1.1.3" 402 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 403 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 404 | 405 | color-name@~1.1.4: 406 | version "1.1.4" 407 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 408 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 409 | 410 | concat-map@0.0.1: 411 | version "0.0.1" 412 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 413 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 414 | 415 | core-js-pure@^3.0.0: 416 | version "3.6.5" 417 | resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" 418 | integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== 419 | 420 | core-util-is@~1.0.0: 421 | version "1.0.2" 422 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 423 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 424 | 425 | cross-spawn@^6.0.5: 426 | version "6.0.5" 427 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 428 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 429 | dependencies: 430 | nice-try "^1.0.4" 431 | path-key "^2.0.1" 432 | semver "^5.5.0" 433 | shebang-command "^1.2.0" 434 | which "^1.2.9" 435 | 436 | debug@2, debug@^2.2.0: 437 | version "2.6.9" 438 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 439 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 440 | dependencies: 441 | ms "2.0.0" 442 | 443 | debug@3.2.6: 444 | version "3.2.6" 445 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 446 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 447 | dependencies: 448 | ms "^2.1.1" 449 | 450 | debug@^4.0.1, debug@^4.1.1: 451 | version "4.1.1" 452 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 453 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 454 | dependencies: 455 | ms "^2.1.1" 456 | 457 | decamelize@^1.2.0: 458 | version "1.2.0" 459 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 460 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 461 | 462 | deep-is@~0.1.3: 463 | version "0.1.3" 464 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 465 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 466 | 467 | define-properties@^1.1.2, define-properties@^1.1.3: 468 | version "1.1.3" 469 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 470 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 471 | dependencies: 472 | object-keys "^1.0.12" 473 | 474 | diff-sequences@^26.0.0: 475 | version "26.0.0" 476 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" 477 | integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== 478 | 479 | diff@3.5.0: 480 | version "3.5.0" 481 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 482 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 483 | 484 | diff@^4.0.1: 485 | version "4.0.2" 486 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 487 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 488 | 489 | doctrine@^2.1.0: 490 | version "2.1.0" 491 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 492 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 493 | dependencies: 494 | esutils "^2.0.2" 495 | 496 | doctrine@^3.0.0: 497 | version "3.0.0" 498 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 499 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 500 | dependencies: 501 | esutils "^2.0.2" 502 | 503 | emoji-regex@^7.0.1: 504 | version "7.0.3" 505 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 506 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 507 | 508 | emoji-regex@^8.0.0: 509 | version "8.0.0" 510 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 511 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 512 | 513 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 514 | version "1.17.5" 515 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 516 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 517 | dependencies: 518 | es-to-primitive "^1.2.1" 519 | function-bind "^1.1.1" 520 | has "^1.0.3" 521 | has-symbols "^1.0.1" 522 | is-callable "^1.1.5" 523 | is-regex "^1.0.5" 524 | object-inspect "^1.7.0" 525 | object-keys "^1.1.1" 526 | object.assign "^4.1.0" 527 | string.prototype.trimleft "^2.1.1" 528 | string.prototype.trimright "^2.1.1" 529 | 530 | es-to-primitive@^1.2.1: 531 | version "1.2.1" 532 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 533 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 534 | dependencies: 535 | is-callable "^1.1.4" 536 | is-date-object "^1.0.1" 537 | is-symbol "^1.0.2" 538 | 539 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 540 | version "1.0.5" 541 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 542 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 543 | 544 | escape-string-regexp@^2.0.0: 545 | version "2.0.0" 546 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" 547 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 548 | 549 | eslint-config-peterkhayes@^2.2.0: 550 | version "2.2.0" 551 | resolved "https://registry.yarnpkg.com/eslint-config-peterkhayes/-/eslint-config-peterkhayes-2.2.0.tgz#4928fa7d110cb4dc4b7d2dcc2eba552fe4dd6a43" 552 | integrity sha512-+1fiOjbVbTYK1UYbgdcLN78liW6aCBDhqWbM5EBfFAK/vbd5z3eGjFevXFWABV9dzu+lAC+3VLRFHVJTG3LPMA== 553 | dependencies: 554 | "@typescript-eslint/eslint-plugin" "^2.27.0" 555 | "@typescript-eslint/parser" "^2.27.0" 556 | eslint-config-prettier "^6.10.1" 557 | eslint-plugin-jest "23.8.2" 558 | eslint-plugin-prettier "^3.1.3" 559 | eslint-plugin-react "^7.19.0" 560 | eslint-plugin-react-hooks "^3.0.0" 561 | prettier "^2.0.4" 562 | 563 | eslint-config-prettier@^6.10.1: 564 | version "6.11.0" 565 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" 566 | integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== 567 | dependencies: 568 | get-stdin "^6.0.0" 569 | 570 | eslint-plugin-jest@23.8.2: 571 | version "23.8.2" 572 | resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" 573 | integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg== 574 | dependencies: 575 | "@typescript-eslint/experimental-utils" "^2.5.0" 576 | 577 | eslint-plugin-prettier@^3.1.3: 578 | version "3.1.3" 579 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" 580 | integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== 581 | dependencies: 582 | prettier-linter-helpers "^1.0.0" 583 | 584 | eslint-plugin-react-hooks@^3.0.0: 585 | version "3.0.0" 586 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz#9e80c71846eb68dd29c3b21d832728aa66e5bd35" 587 | integrity sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw== 588 | 589 | eslint-plugin-react@^7.19.0: 590 | version "7.19.0" 591 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" 592 | integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== 593 | dependencies: 594 | array-includes "^3.1.1" 595 | doctrine "^2.1.0" 596 | has "^1.0.3" 597 | jsx-ast-utils "^2.2.3" 598 | object.entries "^1.1.1" 599 | object.fromentries "^2.0.2" 600 | object.values "^1.1.1" 601 | prop-types "^15.7.2" 602 | resolve "^1.15.1" 603 | semver "^6.3.0" 604 | string.prototype.matchall "^4.0.2" 605 | xregexp "^4.3.0" 606 | 607 | eslint-scope@^5.0.0: 608 | version "5.0.0" 609 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 610 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 611 | dependencies: 612 | esrecurse "^4.1.0" 613 | estraverse "^4.1.1" 614 | 615 | eslint-utils@^1.4.3: 616 | version "1.4.3" 617 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 618 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 619 | dependencies: 620 | eslint-visitor-keys "^1.1.0" 621 | 622 | eslint-utils@^2.0.0: 623 | version "2.0.0" 624 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" 625 | integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== 626 | dependencies: 627 | eslint-visitor-keys "^1.1.0" 628 | 629 | eslint-visitor-keys@^1.1.0: 630 | version "1.1.0" 631 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 632 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 633 | 634 | eslint@^6.8.0: 635 | version "6.8.0" 636 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 637 | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 638 | dependencies: 639 | "@babel/code-frame" "^7.0.0" 640 | ajv "^6.10.0" 641 | chalk "^2.1.0" 642 | cross-spawn "^6.0.5" 643 | debug "^4.0.1" 644 | doctrine "^3.0.0" 645 | eslint-scope "^5.0.0" 646 | eslint-utils "^1.4.3" 647 | eslint-visitor-keys "^1.1.0" 648 | espree "^6.1.2" 649 | esquery "^1.0.1" 650 | esutils "^2.0.2" 651 | file-entry-cache "^5.0.1" 652 | functional-red-black-tree "^1.0.1" 653 | glob-parent "^5.0.0" 654 | globals "^12.1.0" 655 | ignore "^4.0.6" 656 | import-fresh "^3.0.0" 657 | imurmurhash "^0.1.4" 658 | inquirer "^7.0.0" 659 | is-glob "^4.0.0" 660 | js-yaml "^3.13.1" 661 | json-stable-stringify-without-jsonify "^1.0.1" 662 | levn "^0.3.0" 663 | lodash "^4.17.14" 664 | minimatch "^3.0.4" 665 | mkdirp "^0.5.1" 666 | natural-compare "^1.4.0" 667 | optionator "^0.8.3" 668 | progress "^2.0.0" 669 | regexpp "^2.0.1" 670 | semver "^6.1.2" 671 | strip-ansi "^5.2.0" 672 | strip-json-comments "^3.0.1" 673 | table "^5.2.3" 674 | text-table "^0.2.0" 675 | v8-compile-cache "^2.0.3" 676 | 677 | espree@^6.1.2: 678 | version "6.2.1" 679 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" 680 | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== 681 | dependencies: 682 | acorn "^7.1.1" 683 | acorn-jsx "^5.2.0" 684 | eslint-visitor-keys "^1.1.0" 685 | 686 | esprima@^4.0.0: 687 | version "4.0.1" 688 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 689 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 690 | 691 | esquery@^1.0.1: 692 | version "1.3.1" 693 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 694 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 695 | dependencies: 696 | estraverse "^5.1.0" 697 | 698 | esrecurse@^4.1.0: 699 | version "4.2.1" 700 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 701 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 702 | dependencies: 703 | estraverse "^4.1.0" 704 | 705 | estraverse@^4.1.0, estraverse@^4.1.1: 706 | version "4.3.0" 707 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 708 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 709 | 710 | estraverse@^5.1.0: 711 | version "5.1.0" 712 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 713 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== 714 | 715 | esutils@^2.0.2: 716 | version "2.0.3" 717 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 718 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 719 | 720 | expect@^26.0.1: 721 | version "26.0.1" 722 | resolved "https://registry.yarnpkg.com/expect/-/expect-26.0.1.tgz#18697b9611a7e2725e20ba3ceadda49bc9865421" 723 | integrity sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg== 724 | dependencies: 725 | "@jest/types" "^26.0.1" 726 | ansi-styles "^4.0.0" 727 | jest-get-type "^26.0.0" 728 | jest-matcher-utils "^26.0.1" 729 | jest-message-util "^26.0.1" 730 | jest-regex-util "^26.0.0" 731 | 732 | external-editor@^3.0.3: 733 | version "3.1.0" 734 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 735 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 736 | dependencies: 737 | chardet "^0.7.0" 738 | iconv-lite "^0.4.24" 739 | tmp "^0.0.33" 740 | 741 | fast-deep-equal@^3.1.1: 742 | version "3.1.1" 743 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 744 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 745 | 746 | fast-diff@^1.1.2: 747 | version "1.2.0" 748 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 749 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 750 | 751 | fast-json-stable-stringify@^2.0.0: 752 | version "2.1.0" 753 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 754 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 755 | 756 | fast-levenshtein@~2.0.6: 757 | version "2.0.6" 758 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 759 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 760 | 761 | figures@^3.0.0: 762 | version "3.2.0" 763 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 764 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 765 | dependencies: 766 | escape-string-regexp "^1.0.5" 767 | 768 | file-entry-cache@^5.0.1: 769 | version "5.0.1" 770 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 771 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 772 | dependencies: 773 | flat-cache "^2.0.1" 774 | 775 | fill-range@^7.0.1: 776 | version "7.0.1" 777 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 778 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 779 | dependencies: 780 | to-regex-range "^5.0.1" 781 | 782 | find-up@3.0.0, find-up@^3.0.0: 783 | version "3.0.0" 784 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 785 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 786 | dependencies: 787 | locate-path "^3.0.0" 788 | 789 | flat-cache@^2.0.1: 790 | version "2.0.1" 791 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 792 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 793 | dependencies: 794 | flatted "^2.0.0" 795 | rimraf "2.6.3" 796 | write "1.0.3" 797 | 798 | flat@^4.1.0: 799 | version "4.1.0" 800 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 801 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 802 | dependencies: 803 | is-buffer "~2.0.3" 804 | 805 | flatted@^2.0.0: 806 | version "2.0.2" 807 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 808 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 809 | 810 | fs.realpath@^1.0.0: 811 | version "1.0.0" 812 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 813 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 814 | 815 | fsevents@~2.1.1: 816 | version "2.1.3" 817 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 818 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 819 | 820 | function-bind@^1.1.1: 821 | version "1.1.1" 822 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 823 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 824 | 825 | functional-red-black-tree@^1.0.1: 826 | version "1.0.1" 827 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 828 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 829 | 830 | get-caller-file@^2.0.1: 831 | version "2.0.5" 832 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 833 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 834 | 835 | get-stdin@^6.0.0: 836 | version "6.0.0" 837 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 838 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 839 | 840 | glob-parent@^5.0.0, glob-parent@~5.1.0: 841 | version "5.1.2" 842 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 843 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 844 | dependencies: 845 | is-glob "^4.0.1" 846 | 847 | glob@7.1.3: 848 | version "7.1.3" 849 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 850 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 851 | dependencies: 852 | fs.realpath "^1.0.0" 853 | inflight "^1.0.4" 854 | inherits "2" 855 | minimatch "^3.0.4" 856 | once "^1.3.0" 857 | path-is-absolute "^1.0.0" 858 | 859 | glob@^7.1.3, glob@^7.1.6: 860 | version "7.1.6" 861 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 862 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 863 | dependencies: 864 | fs.realpath "^1.0.0" 865 | inflight "^1.0.4" 866 | inherits "2" 867 | minimatch "^3.0.4" 868 | once "^1.3.0" 869 | path-is-absolute "^1.0.0" 870 | 871 | globals@^12.1.0: 872 | version "12.4.0" 873 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 874 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 875 | dependencies: 876 | type-fest "^0.8.1" 877 | 878 | graceful-fs@^4.2.4: 879 | version "4.2.4" 880 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 881 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 882 | 883 | growl@1.10.5: 884 | version "1.10.5" 885 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 886 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 887 | 888 | has-flag@^3.0.0: 889 | version "3.0.0" 890 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 891 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 892 | 893 | has-flag@^4.0.0: 894 | version "4.0.0" 895 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 896 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 897 | 898 | has-symbols@^1.0.0, has-symbols@^1.0.1: 899 | version "1.0.1" 900 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 901 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 902 | 903 | has@^1.0.3: 904 | version "1.0.3" 905 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 906 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 907 | dependencies: 908 | function-bind "^1.1.1" 909 | 910 | he@1.2.0: 911 | version "1.2.0" 912 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 913 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 914 | 915 | iconv-lite@^0.4.24: 916 | version "0.4.24" 917 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 918 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 919 | dependencies: 920 | safer-buffer ">= 2.1.2 < 3" 921 | 922 | ignore@^4.0.6: 923 | version "4.0.6" 924 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 925 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 926 | 927 | import-fresh@^3.0.0: 928 | version "3.2.1" 929 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 930 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 931 | dependencies: 932 | parent-module "^1.0.0" 933 | resolve-from "^4.0.0" 934 | 935 | imurmurhash@^0.1.4: 936 | version "0.1.4" 937 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 938 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 939 | 940 | inflight@^1.0.4: 941 | version "1.0.6" 942 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 943 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 944 | dependencies: 945 | once "^1.3.0" 946 | wrappy "1" 947 | 948 | inherits@2, inherits@~2.0.1: 949 | version "2.0.4" 950 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 951 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 952 | 953 | inquirer@^7.0.0: 954 | version "7.1.0" 955 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" 956 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== 957 | dependencies: 958 | ansi-escapes "^4.2.1" 959 | chalk "^3.0.0" 960 | cli-cursor "^3.1.0" 961 | cli-width "^2.0.0" 962 | external-editor "^3.0.3" 963 | figures "^3.0.0" 964 | lodash "^4.17.15" 965 | mute-stream "0.0.8" 966 | run-async "^2.4.0" 967 | rxjs "^6.5.3" 968 | string-width "^4.1.0" 969 | strip-ansi "^6.0.0" 970 | through "^2.3.6" 971 | 972 | internal-slot@^1.0.2: 973 | version "1.0.2" 974 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" 975 | integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== 976 | dependencies: 977 | es-abstract "^1.17.0-next.1" 978 | has "^1.0.3" 979 | side-channel "^1.0.2" 980 | 981 | is-binary-path@~2.1.0: 982 | version "2.1.0" 983 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 984 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 985 | dependencies: 986 | binary-extensions "^2.0.0" 987 | 988 | is-buffer@~2.0.3: 989 | version "2.0.4" 990 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 991 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 992 | 993 | is-callable@^1.1.4, is-callable@^1.1.5: 994 | version "1.1.5" 995 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 996 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 997 | 998 | is-date-object@^1.0.1: 999 | version "1.0.2" 1000 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1001 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1002 | 1003 | is-extglob@^2.1.1: 1004 | version "2.1.1" 1005 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1006 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1007 | 1008 | is-fullwidth-code-point@^2.0.0: 1009 | version "2.0.0" 1010 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1011 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1012 | 1013 | is-fullwidth-code-point@^3.0.0: 1014 | version "3.0.0" 1015 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1016 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1017 | 1018 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 1019 | version "4.0.1" 1020 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1021 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1022 | dependencies: 1023 | is-extglob "^2.1.1" 1024 | 1025 | is-number@^7.0.0: 1026 | version "7.0.0" 1027 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1028 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1029 | 1030 | is-regex@^1.0.5: 1031 | version "1.0.5" 1032 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 1033 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 1034 | dependencies: 1035 | has "^1.0.3" 1036 | 1037 | is-string@^1.0.5: 1038 | version "1.0.5" 1039 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 1040 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 1041 | 1042 | is-symbol@^1.0.2: 1043 | version "1.0.3" 1044 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1045 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1046 | dependencies: 1047 | has-symbols "^1.0.1" 1048 | 1049 | isarray@0.0.1: 1050 | version "0.0.1" 1051 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1052 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 1053 | 1054 | isexe@^2.0.0: 1055 | version "2.0.0" 1056 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1057 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1058 | 1059 | jest-diff@^26.0.1: 1060 | version "26.0.1" 1061 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.0.1.tgz#c44ab3cdd5977d466de69c46929e0e57f89aa1de" 1062 | integrity sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ== 1063 | dependencies: 1064 | chalk "^4.0.0" 1065 | diff-sequences "^26.0.0" 1066 | jest-get-type "^26.0.0" 1067 | pretty-format "^26.0.1" 1068 | 1069 | jest-get-type@^26.0.0: 1070 | version "26.0.0" 1071 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" 1072 | integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== 1073 | 1074 | jest-matcher-utils@^26.0.1: 1075 | version "26.0.1" 1076 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz#12e1fc386fe4f14678f4cc8dbd5ba75a58092911" 1077 | integrity sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw== 1078 | dependencies: 1079 | chalk "^4.0.0" 1080 | jest-diff "^26.0.1" 1081 | jest-get-type "^26.0.0" 1082 | pretty-format "^26.0.1" 1083 | 1084 | jest-message-util@^26.0.1: 1085 | version "26.0.1" 1086 | resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.0.1.tgz#07af1b42fc450b4cc8e90e4c9cef11b33ce9b0ac" 1087 | integrity sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q== 1088 | dependencies: 1089 | "@babel/code-frame" "^7.0.0" 1090 | "@jest/types" "^26.0.1" 1091 | "@types/stack-utils" "^1.0.1" 1092 | chalk "^4.0.0" 1093 | graceful-fs "^4.2.4" 1094 | micromatch "^4.0.2" 1095 | slash "^3.0.0" 1096 | stack-utils "^2.0.2" 1097 | 1098 | jest-regex-util@^26.0.0: 1099 | version "26.0.0" 1100 | resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" 1101 | integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== 1102 | 1103 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1104 | version "4.0.0" 1105 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1106 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1107 | 1108 | js-yaml@3.13.1, js-yaml@^3.13.1: 1109 | version "3.13.1" 1110 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1111 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1112 | dependencies: 1113 | argparse "^1.0.7" 1114 | esprima "^4.0.0" 1115 | 1116 | json-schema-traverse@^0.4.1: 1117 | version "0.4.1" 1118 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1119 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1120 | 1121 | json-stable-stringify-without-jsonify@^1.0.1: 1122 | version "1.0.1" 1123 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1124 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1125 | 1126 | jsx-ast-utils@^2.2.3: 1127 | version "2.2.3" 1128 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" 1129 | integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== 1130 | dependencies: 1131 | array-includes "^3.0.3" 1132 | object.assign "^4.1.0" 1133 | 1134 | levn@^0.3.0, levn@~0.3.0: 1135 | version "0.3.0" 1136 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1137 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 1138 | dependencies: 1139 | prelude-ls "~1.1.2" 1140 | type-check "~0.3.2" 1141 | 1142 | locate-path@^3.0.0: 1143 | version "3.0.0" 1144 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1145 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1146 | dependencies: 1147 | p-locate "^3.0.0" 1148 | path-exists "^3.0.0" 1149 | 1150 | lodash@^4.17.14, lodash@^4.17.15: 1151 | version "4.17.19" 1152 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 1153 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 1154 | 1155 | log-symbols@3.0.0: 1156 | version "3.0.0" 1157 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 1158 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 1159 | dependencies: 1160 | chalk "^2.4.2" 1161 | 1162 | loose-envify@^1.4.0: 1163 | version "1.4.0" 1164 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1165 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1166 | dependencies: 1167 | js-tokens "^3.0.0 || ^4.0.0" 1168 | 1169 | make-error@^1.1.1: 1170 | version "1.3.6" 1171 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1172 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1173 | 1174 | micromatch@^4.0.2: 1175 | version "4.0.2" 1176 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" 1177 | integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== 1178 | dependencies: 1179 | braces "^3.0.1" 1180 | picomatch "^2.0.5" 1181 | 1182 | mimic-fn@^2.1.0: 1183 | version "2.1.0" 1184 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1185 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1186 | 1187 | minimatch@3.0.4, minimatch@^3.0.4: 1188 | version "3.0.4" 1189 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1190 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1191 | dependencies: 1192 | brace-expansion "^1.1.7" 1193 | 1194 | minimist@^1.2.5: 1195 | version "1.2.5" 1196 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1197 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1198 | 1199 | mkdirp@0.5.5, mkdirp@^0.5.1: 1200 | version "0.5.5" 1201 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1202 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1203 | dependencies: 1204 | minimist "^1.2.5" 1205 | 1206 | mocha@^7.1.2: 1207 | version "7.1.2" 1208 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" 1209 | integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== 1210 | dependencies: 1211 | ansi-colors "3.2.3" 1212 | browser-stdout "1.3.1" 1213 | chokidar "3.3.0" 1214 | debug "3.2.6" 1215 | diff "3.5.0" 1216 | escape-string-regexp "1.0.5" 1217 | find-up "3.0.0" 1218 | glob "7.1.3" 1219 | growl "1.10.5" 1220 | he "1.2.0" 1221 | js-yaml "3.13.1" 1222 | log-symbols "3.0.0" 1223 | minimatch "3.0.4" 1224 | mkdirp "0.5.5" 1225 | ms "2.1.1" 1226 | node-environment-flags "1.0.6" 1227 | object.assign "4.1.0" 1228 | strip-json-comments "2.0.1" 1229 | supports-color "6.0.0" 1230 | which "1.3.1" 1231 | wide-align "1.1.3" 1232 | yargs "13.3.2" 1233 | yargs-parser "13.1.2" 1234 | yargs-unparser "1.6.0" 1235 | 1236 | ms@2.0.0: 1237 | version "2.0.0" 1238 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1239 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1240 | 1241 | ms@2.1.1: 1242 | version "2.1.1" 1243 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1244 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1245 | 1246 | ms@^2.1.1: 1247 | version "2.1.2" 1248 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1249 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1250 | 1251 | mute-stream@0.0.8: 1252 | version "0.0.8" 1253 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1254 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1255 | 1256 | mz@^2.4.0: 1257 | version "2.7.0" 1258 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1259 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1260 | dependencies: 1261 | any-promise "^1.0.0" 1262 | object-assign "^4.0.1" 1263 | thenify-all "^1.0.0" 1264 | 1265 | natural-compare@^1.4.0: 1266 | version "1.4.0" 1267 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1268 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1269 | 1270 | nice-try@^1.0.4: 1271 | version "1.0.5" 1272 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1273 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1274 | 1275 | node-environment-flags@1.0.6: 1276 | version "1.0.6" 1277 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" 1278 | integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== 1279 | dependencies: 1280 | object.getownpropertydescriptors "^2.0.3" 1281 | semver "^5.7.0" 1282 | 1283 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1284 | version "3.0.0" 1285 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1286 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1287 | 1288 | object-assign@^4.0.1, object-assign@^4.1.1: 1289 | version "4.1.1" 1290 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1291 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1292 | 1293 | object-inspect@^1.7.0: 1294 | version "1.7.0" 1295 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1296 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1297 | 1298 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1299 | version "1.1.1" 1300 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1301 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1302 | 1303 | object.assign@4.1.0, object.assign@^4.1.0: 1304 | version "4.1.0" 1305 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1306 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1307 | dependencies: 1308 | define-properties "^1.1.2" 1309 | function-bind "^1.1.1" 1310 | has-symbols "^1.0.0" 1311 | object-keys "^1.0.11" 1312 | 1313 | object.entries@^1.1.1: 1314 | version "1.1.1" 1315 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" 1316 | integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== 1317 | dependencies: 1318 | define-properties "^1.1.3" 1319 | es-abstract "^1.17.0-next.1" 1320 | function-bind "^1.1.1" 1321 | has "^1.0.3" 1322 | 1323 | object.fromentries@^2.0.2: 1324 | version "2.0.2" 1325 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" 1326 | integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== 1327 | dependencies: 1328 | define-properties "^1.1.3" 1329 | es-abstract "^1.17.0-next.1" 1330 | function-bind "^1.1.1" 1331 | has "^1.0.3" 1332 | 1333 | object.getownpropertydescriptors@^2.0.3: 1334 | version "2.1.0" 1335 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 1336 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 1337 | dependencies: 1338 | define-properties "^1.1.3" 1339 | es-abstract "^1.17.0-next.1" 1340 | 1341 | object.values@^1.1.1: 1342 | version "1.1.1" 1343 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" 1344 | integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== 1345 | dependencies: 1346 | define-properties "^1.1.3" 1347 | es-abstract "^1.17.0-next.1" 1348 | function-bind "^1.1.1" 1349 | has "^1.0.3" 1350 | 1351 | once@^1.3.0: 1352 | version "1.4.0" 1353 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1354 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1355 | dependencies: 1356 | wrappy "1" 1357 | 1358 | onetime@^5.1.0: 1359 | version "5.1.0" 1360 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1361 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1362 | dependencies: 1363 | mimic-fn "^2.1.0" 1364 | 1365 | optionator@^0.8.3: 1366 | version "0.8.3" 1367 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1368 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1369 | dependencies: 1370 | deep-is "~0.1.3" 1371 | fast-levenshtein "~2.0.6" 1372 | levn "~0.3.0" 1373 | prelude-ls "~1.1.2" 1374 | type-check "~0.3.2" 1375 | word-wrap "~1.2.3" 1376 | 1377 | os-tmpdir@~1.0.2: 1378 | version "1.0.2" 1379 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1380 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1381 | 1382 | p-limit@^2.0.0: 1383 | version "2.3.0" 1384 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1385 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1386 | dependencies: 1387 | p-try "^2.0.0" 1388 | 1389 | p-locate@^3.0.0: 1390 | version "3.0.0" 1391 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1392 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1393 | dependencies: 1394 | p-limit "^2.0.0" 1395 | 1396 | p-try@^2.0.0: 1397 | version "2.2.0" 1398 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1399 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1400 | 1401 | parent-module@^1.0.0: 1402 | version "1.0.1" 1403 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1404 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1405 | dependencies: 1406 | callsites "^3.0.0" 1407 | 1408 | path-exists@^3.0.0: 1409 | version "3.0.0" 1410 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1411 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1412 | 1413 | path-is-absolute@^1.0.0: 1414 | version "1.0.1" 1415 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1416 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1417 | 1418 | path-key@^2.0.1: 1419 | version "2.0.1" 1420 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1421 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1422 | 1423 | path-parse@^1.0.6: 1424 | version "1.0.7" 1425 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1426 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1427 | 1428 | picomatch@^2.0.4, picomatch@^2.0.5: 1429 | version "2.2.2" 1430 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1431 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1432 | 1433 | prelude-ls@~1.1.2: 1434 | version "1.1.2" 1435 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1436 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1437 | 1438 | prettier-linter-helpers@^1.0.0: 1439 | version "1.0.0" 1440 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1441 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1442 | dependencies: 1443 | fast-diff "^1.1.2" 1444 | 1445 | prettier@^2.0.4, prettier@^2.0.5: 1446 | version "2.0.5" 1447 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" 1448 | integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== 1449 | 1450 | pretty-format@^26.0.1: 1451 | version "26.0.1" 1452 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.0.1.tgz#a4fe54fe428ad2fd3413ca6bbd1ec8c2e277e197" 1453 | integrity sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw== 1454 | dependencies: 1455 | "@jest/types" "^26.0.1" 1456 | ansi-regex "^5.0.0" 1457 | ansi-styles "^4.0.0" 1458 | react-is "^16.12.0" 1459 | 1460 | progress@^2.0.0: 1461 | version "2.0.3" 1462 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1463 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1464 | 1465 | prop-types@^15.7.2: 1466 | version "15.7.2" 1467 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 1468 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 1469 | dependencies: 1470 | loose-envify "^1.4.0" 1471 | object-assign "^4.1.1" 1472 | react-is "^16.8.1" 1473 | 1474 | punycode@^2.1.0: 1475 | version "2.1.1" 1476 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1477 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1478 | 1479 | react-is@^16.12.0, react-is@^16.8.1: 1480 | version "16.13.1" 1481 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1482 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1483 | 1484 | readable-stream@^1.1.14: 1485 | version "1.1.14" 1486 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1487 | integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= 1488 | dependencies: 1489 | core-util-is "~1.0.0" 1490 | inherits "~2.0.1" 1491 | isarray "0.0.1" 1492 | string_decoder "~0.10.x" 1493 | 1494 | readdirp@~3.2.0: 1495 | version "3.2.0" 1496 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" 1497 | integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== 1498 | dependencies: 1499 | picomatch "^2.0.4" 1500 | 1501 | regenerator-runtime@^0.13.4: 1502 | version "0.13.5" 1503 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" 1504 | integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== 1505 | 1506 | regexp.prototype.flags@^1.3.0: 1507 | version "1.3.0" 1508 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" 1509 | integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== 1510 | dependencies: 1511 | define-properties "^1.1.3" 1512 | es-abstract "^1.17.0-next.1" 1513 | 1514 | regexpp@^2.0.1: 1515 | version "2.0.1" 1516 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1517 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1518 | 1519 | regexpp@^3.0.0: 1520 | version "3.1.0" 1521 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1522 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1523 | 1524 | require-directory@^2.1.1: 1525 | version "2.1.1" 1526 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1527 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1528 | 1529 | require-main-filename@^2.0.0: 1530 | version "2.0.0" 1531 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1532 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1533 | 1534 | resolve-from@^4.0.0: 1535 | version "4.0.0" 1536 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1537 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1538 | 1539 | resolve@^1.15.1: 1540 | version "1.17.0" 1541 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1542 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1543 | dependencies: 1544 | path-parse "^1.0.6" 1545 | 1546 | restore-cursor@^3.1.0: 1547 | version "3.1.0" 1548 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1549 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1550 | dependencies: 1551 | onetime "^5.1.0" 1552 | signal-exit "^3.0.2" 1553 | 1554 | rimraf@2.6.3: 1555 | version "2.6.3" 1556 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1557 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1558 | dependencies: 1559 | glob "^7.1.3" 1560 | 1561 | run-async@^2.4.0: 1562 | version "2.4.1" 1563 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1564 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1565 | 1566 | rxjs@^6.5.3: 1567 | version "6.5.5" 1568 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 1569 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 1570 | dependencies: 1571 | tslib "^1.9.0" 1572 | 1573 | "safer-buffer@>= 2.1.2 < 3": 1574 | version "2.1.2" 1575 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1576 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1577 | 1578 | semver@^5.5.0, semver@^5.7.0: 1579 | version "5.7.1" 1580 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1581 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1582 | 1583 | semver@^6.1.2, semver@^6.3.0: 1584 | version "6.3.0" 1585 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1586 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1587 | 1588 | set-blocking@^2.0.0: 1589 | version "2.0.0" 1590 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1591 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1592 | 1593 | shebang-command@^1.2.0: 1594 | version "1.2.0" 1595 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1596 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1597 | dependencies: 1598 | shebang-regex "^1.0.0" 1599 | 1600 | shebang-regex@^1.0.0: 1601 | version "1.0.0" 1602 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1603 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1604 | 1605 | side-channel@^1.0.2: 1606 | version "1.0.2" 1607 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" 1608 | integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== 1609 | dependencies: 1610 | es-abstract "^1.17.0-next.1" 1611 | object-inspect "^1.7.0" 1612 | 1613 | signal-exit@^3.0.2: 1614 | version "3.0.3" 1615 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1616 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1617 | 1618 | slash@^3.0.0: 1619 | version "3.0.0" 1620 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1621 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1622 | 1623 | slice-ansi@^2.1.0: 1624 | version "2.1.0" 1625 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1626 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1627 | dependencies: 1628 | ansi-styles "^3.2.0" 1629 | astral-regex "^1.0.0" 1630 | is-fullwidth-code-point "^2.0.0" 1631 | 1632 | source-map-support@^0.5.17: 1633 | version "0.5.19" 1634 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1635 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1636 | dependencies: 1637 | buffer-from "^1.0.0" 1638 | source-map "^0.6.0" 1639 | 1640 | source-map@^0.6.0: 1641 | version "0.6.1" 1642 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1643 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1644 | 1645 | sprintf-js@~1.0.2: 1646 | version "1.0.3" 1647 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1648 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1649 | 1650 | stack-utils@^2.0.2: 1651 | version "2.0.2" 1652 | resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" 1653 | integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== 1654 | dependencies: 1655 | escape-string-regexp "^2.0.0" 1656 | 1657 | stream-parser@^0.3.1: 1658 | version "0.3.1" 1659 | resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" 1660 | integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= 1661 | dependencies: 1662 | debug "2" 1663 | 1664 | "string-width@^1.0.2 || 2": 1665 | version "2.1.1" 1666 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1667 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1668 | dependencies: 1669 | is-fullwidth-code-point "^2.0.0" 1670 | strip-ansi "^4.0.0" 1671 | 1672 | string-width@^3.0.0, string-width@^3.1.0: 1673 | version "3.1.0" 1674 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1675 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1676 | dependencies: 1677 | emoji-regex "^7.0.1" 1678 | is-fullwidth-code-point "^2.0.0" 1679 | strip-ansi "^5.1.0" 1680 | 1681 | string-width@^4.1.0: 1682 | version "4.2.0" 1683 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1684 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1685 | dependencies: 1686 | emoji-regex "^8.0.0" 1687 | is-fullwidth-code-point "^3.0.0" 1688 | strip-ansi "^6.0.0" 1689 | 1690 | string.prototype.matchall@^4.0.2: 1691 | version "4.0.2" 1692 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" 1693 | integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== 1694 | dependencies: 1695 | define-properties "^1.1.3" 1696 | es-abstract "^1.17.0" 1697 | has-symbols "^1.0.1" 1698 | internal-slot "^1.0.2" 1699 | regexp.prototype.flags "^1.3.0" 1700 | side-channel "^1.0.2" 1701 | 1702 | string.prototype.trimend@^1.0.0: 1703 | version "1.0.1" 1704 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1705 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1706 | dependencies: 1707 | define-properties "^1.1.3" 1708 | es-abstract "^1.17.5" 1709 | 1710 | string.prototype.trimleft@^2.1.1: 1711 | version "2.1.2" 1712 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1713 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 1714 | dependencies: 1715 | define-properties "^1.1.3" 1716 | es-abstract "^1.17.5" 1717 | string.prototype.trimstart "^1.0.0" 1718 | 1719 | string.prototype.trimright@^2.1.1: 1720 | version "2.1.2" 1721 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1722 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 1723 | dependencies: 1724 | define-properties "^1.1.3" 1725 | es-abstract "^1.17.5" 1726 | string.prototype.trimend "^1.0.0" 1727 | 1728 | string.prototype.trimstart@^1.0.0: 1729 | version "1.0.1" 1730 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1731 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1732 | dependencies: 1733 | define-properties "^1.1.3" 1734 | es-abstract "^1.17.5" 1735 | 1736 | string_decoder@~0.10.x: 1737 | version "0.10.31" 1738 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1739 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 1740 | 1741 | strip-ansi@^4.0.0: 1742 | version "4.0.0" 1743 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1744 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1745 | dependencies: 1746 | ansi-regex "^3.0.0" 1747 | 1748 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1749 | version "5.2.0" 1750 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1751 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1752 | dependencies: 1753 | ansi-regex "^4.1.0" 1754 | 1755 | strip-ansi@^6.0.0: 1756 | version "6.0.0" 1757 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1758 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1759 | dependencies: 1760 | ansi-regex "^5.0.0" 1761 | 1762 | strip-json-comments@2.0.1: 1763 | version "2.0.1" 1764 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1765 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1766 | 1767 | strip-json-comments@^3.0.1: 1768 | version "3.1.0" 1769 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" 1770 | integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== 1771 | 1772 | supports-color@6.0.0: 1773 | version "6.0.0" 1774 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 1775 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 1776 | dependencies: 1777 | has-flag "^3.0.0" 1778 | 1779 | supports-color@^5.3.0: 1780 | version "5.5.0" 1781 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1782 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1783 | dependencies: 1784 | has-flag "^3.0.0" 1785 | 1786 | supports-color@^7.1.0: 1787 | version "7.1.0" 1788 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1789 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1790 | dependencies: 1791 | has-flag "^4.0.0" 1792 | 1793 | table@^5.2.3: 1794 | version "5.4.6" 1795 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1796 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1797 | dependencies: 1798 | ajv "^6.10.2" 1799 | lodash "^4.17.14" 1800 | slice-ansi "^2.1.0" 1801 | string-width "^3.0.0" 1802 | 1803 | text-table@^0.2.0: 1804 | version "0.2.0" 1805 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1806 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1807 | 1808 | thenify-all@^1.0.0: 1809 | version "1.6.0" 1810 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 1811 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 1812 | dependencies: 1813 | thenify ">= 3.1.0 < 4" 1814 | 1815 | "thenify@>= 3.1.0 < 4": 1816 | version "3.3.0" 1817 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 1818 | integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 1819 | dependencies: 1820 | any-promise "^1.0.0" 1821 | 1822 | through@^2.3.6: 1823 | version "2.3.8" 1824 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1825 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1826 | 1827 | tmp@^0.0.33: 1828 | version "0.0.33" 1829 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1830 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1831 | dependencies: 1832 | os-tmpdir "~1.0.2" 1833 | 1834 | to-regex-range@^5.0.1: 1835 | version "5.0.1" 1836 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1837 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1838 | dependencies: 1839 | is-number "^7.0.0" 1840 | 1841 | ts-node@^8.10.1: 1842 | version "8.10.1" 1843 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3" 1844 | integrity sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw== 1845 | dependencies: 1846 | arg "^4.1.0" 1847 | diff "^4.0.1" 1848 | make-error "^1.1.1" 1849 | source-map-support "^0.5.17" 1850 | yn "3.1.1" 1851 | 1852 | tslib@^1.8.1, tslib@^1.9.0: 1853 | version "1.11.1" 1854 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" 1855 | integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== 1856 | 1857 | tsutils@^3.17.1: 1858 | version "3.17.1" 1859 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 1860 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 1861 | dependencies: 1862 | tslib "^1.8.1" 1863 | 1864 | type-check@~0.3.2: 1865 | version "0.3.2" 1866 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1867 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1868 | dependencies: 1869 | prelude-ls "~1.1.2" 1870 | 1871 | type-fest@^0.11.0: 1872 | version "0.11.0" 1873 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1874 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1875 | 1876 | type-fest@^0.8.1: 1877 | version "0.8.1" 1878 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1879 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1880 | 1881 | typescript@^3.8.3: 1882 | version "3.8.3" 1883 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" 1884 | integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== 1885 | 1886 | uri-js@^4.2.2: 1887 | version "4.2.2" 1888 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1889 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1890 | dependencies: 1891 | punycode "^2.1.0" 1892 | 1893 | v8-compile-cache@^2.0.3: 1894 | version "2.1.0" 1895 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1896 | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1897 | 1898 | wav-decoder@^1.1.0: 1899 | version "1.3.0" 1900 | resolved "https://registry.yarnpkg.com/wav-decoder/-/wav-decoder-1.3.0.tgz#1d0bf7195f623661bd182464c434a3e8bc42eb0e" 1901 | integrity sha512-4U6O/JNb1dPO90CO2YMTQ5N2plJcntm39vNMvRq9VZ4Vy5FzS7Lnx95N2QcYUyKYcZfCbhI//W3dSHA8YnOQyQ== 1902 | 1903 | wav@^1.0.0: 1904 | version "1.0.2" 1905 | resolved "https://registry.yarnpkg.com/wav/-/wav-1.0.2.tgz#bdbf3fa0d9b4519e9dfd2f603299ead0a2f22060" 1906 | integrity sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg== 1907 | dependencies: 1908 | buffer-alloc "^1.1.0" 1909 | buffer-from "^1.0.0" 1910 | debug "^2.2.0" 1911 | readable-stream "^1.1.14" 1912 | stream-parser "^0.3.1" 1913 | 1914 | which-module@^2.0.0: 1915 | version "2.0.0" 1916 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1917 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1918 | 1919 | which@1.3.1, which@^1.2.9: 1920 | version "1.3.1" 1921 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1922 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1923 | dependencies: 1924 | isexe "^2.0.0" 1925 | 1926 | wide-align@1.1.3: 1927 | version "1.1.3" 1928 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1929 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1930 | dependencies: 1931 | string-width "^1.0.2 || 2" 1932 | 1933 | word-wrap@~1.2.3: 1934 | version "1.2.3" 1935 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1936 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1937 | 1938 | wrap-ansi@^5.1.0: 1939 | version "5.1.0" 1940 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1941 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1942 | dependencies: 1943 | ansi-styles "^3.2.0" 1944 | string-width "^3.0.0" 1945 | strip-ansi "^5.0.0" 1946 | 1947 | wrappy@1: 1948 | version "1.0.2" 1949 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1950 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1951 | 1952 | write@1.0.3: 1953 | version "1.0.3" 1954 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1955 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1956 | dependencies: 1957 | mkdirp "^0.5.1" 1958 | 1959 | xregexp@^4.3.0: 1960 | version "4.3.0" 1961 | resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" 1962 | integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== 1963 | dependencies: 1964 | "@babel/runtime-corejs3" "^7.8.3" 1965 | 1966 | y18n@^4.0.0: 1967 | version "4.0.1" 1968 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 1969 | integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== 1970 | 1971 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 1972 | version "13.1.2" 1973 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 1974 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 1975 | dependencies: 1976 | camelcase "^5.0.0" 1977 | decamelize "^1.2.0" 1978 | 1979 | yargs-unparser@1.6.0: 1980 | version "1.6.0" 1981 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 1982 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 1983 | dependencies: 1984 | flat "^4.1.0" 1985 | lodash "^4.17.15" 1986 | yargs "^13.3.0" 1987 | 1988 | yargs@13.3.2, yargs@^13.3.0: 1989 | version "13.3.2" 1990 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 1991 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 1992 | dependencies: 1993 | cliui "^5.0.0" 1994 | find-up "^3.0.0" 1995 | get-caller-file "^2.0.1" 1996 | require-directory "^2.1.1" 1997 | require-main-filename "^2.0.0" 1998 | set-blocking "^2.0.0" 1999 | string-width "^3.0.0" 2000 | which-module "^2.0.0" 2001 | y18n "^4.0.0" 2002 | yargs-parser "^13.1.2" 2003 | 2004 | yn@3.1.1: 2005 | version "3.1.1" 2006 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2007 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2008 | --------------------------------------------------------------------------------